IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 获取字符串的md5sum值——分别使用shell、python、c++实现 -> 正文阅读

[Python知识库]获取字符串的md5sum值——分别使用shell、python、c++实现

md5sum


在Linux下,我们经常使用md5sum命令来查看两个文件是否相同。

md5sum命令会逐位对文件的内容进行校验。是文件的内容,与文件名无关,也就是文件内容相同,其md5值相同。

存在两个文件不同,但md5sum相同的情况。不过这个情况出现的概率还是很低的,所以md5值仍然是常用的方法。

md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值。

如果对结果的准确性要求极高,可以使用sha系列算法,比如SHA1、SHA256、SHA384、SHA512等。

如前所述,直接对文件名运行md5sum命令,它计算的是文件内容的md5值,那么如何对指定字符串求md5值呢?

shell


在Linux上运行md5sum命令可得到文件内容的md5值:

% cat a.csv
abc

% md5sum a.csv 
0bee89b07a248e27c83fc3d5951213c1  a.csv

% cp a.csv b.csv

% md5sum b.csv 
0bee89b07a248e27c83fc3d5951213c1  b.csv

如上,两个文件名不同,但文件内容相同,所以md5sum得到的值相同。

如果想对指定字符串计算md5,可以借助管道:

% echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1  -

% echo abc | md5sum | cut -d ' ' -f 1
0bee89b07a248e27c83fc3d5951213c1

注意,echo命令默认是带换行符的,使用-n参数只计算看到的字符串的md5:

% echo -n abc | md5sum | cut -d ' ' -f 1
900150983cd24fb0d6963f7d28e17f72

这样就可以计算任意给定字符串的md5了,脚本如下:

# 计算目录下所有zip文件名的md5值
#!/bin/bash

function filename2md5sum()
{
    sum=$(echo -n $1 | md5sum | cut -d ' ' -f 1)
    echo $sum
}

function change_filenames()
{
    count=0
    for file in *.zip
    do
        if test -f $file; then
            echo $file: 
            filename2md5sum $file
            ret=$?
            if [ $ret -eq 0 ]; then
                count=$(($count+1))
            fi
        fi
    done

    echo $count 个文件名已输出
}

change_filenames

python


使用hashlib,直接上代码了:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import hashlib
import os
from pathlib import Path
 
def get_md5_value(src):
    md5 = hashlib.md5()
    md5.update(src)
    md5sum = md5.hexdigest()
    return md5sum

def main():
    basedir = '.'
    for root, ds, fs in os.walk(basedir):
        for f in fs:
            if f.endswith('.zip'):
            		# use encode by utf-8 avoid error: Unicode-objects must be encoded before hashing
                md5sum = get_md5_value(f.encode('utf-8'))
                print('file: {}\n{}'.format(f,md5sum))
if __name__== '__main__':
    main()

c++


使用popen得到命令行执行的输出结果,代码如下:

#include <string>
#include <iostream>

using namespace std;

string get_md5sum(const string& filename) {
  string md5string;
  string cmd = "echo -n '" + filename + "' | md5sum | cut -d ' ' -f 1";
  FILE* pipe = popen(cmd.c_str(), "r");
  if (pipe != NULL) {
    static const unsigned md5size = 32;
    unsigned char md5res[md5size + 1];
    int readSize = fread((void*)md5res, sizeof(char), md5size, pipe);
    pclose(pipe);
    if (readSize != md5size) {
      std::cout << "Error reading md5" << std::endl;
      return md5string;
    }
    md5res[md5size] = 0;
    md5string.assign(&md5res[0], &md5res[md5size]);
  }

  return md5string;
}

int main(int argc, char* argv[]) {
  if (argc != 2) {
    cout << "Usage: " << argv[0] << " string4md5sum" << endl;
    return 0;
  }

  string filename = argv[1];
  cout << get_md5sum(filename) << endl;
  return 0;
}

小节


只要在一种平台下把它原理搞清楚,在其他平台复现只是熟悉程度的问题了。

这只是一个小demo,可以在此基础上进行扩展,实现更具意义的功能了。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:36:21  更:2022-05-09 12:38:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:24:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码