hashlib与Linux中的md5sum

Linux中计算文件或者字符串的md5值有一个工具叫做md5sum,其用法为:

[root@ecs01 ~]# md5sum ConcisePro2.1.zip 
73cf3f51e8ee982d3155065cbe4e826c  ConcisePro2.1.zip
[root@ecs01 ~]# echo -n "hello"|md5sum
5d41402abc4b2a76b9719d911017c592  -

同样的功能在Python中可以使用hashlib模块实现:

1 >>> import hashlib
2 >>> md5_o = hashlib.md5(bytes('hello',encoding="utf-8"))
3 >>> md5_o.hexdigest()
4 '5d41402abc4b2a76b9719d911017c592'

Python中对文件进行hash计算则可以根据文件大小分成两种情形来进行计算。因为需要把文件内容加载到内存中,所以文件不大时一次性加载到内存对内存占用不大的话可以直接计算;如果文件超过500M/1GB这样的尺寸一次性加载到内存,会同时占用大量的内存、CPU、IO资源,所以会把一个大文件进行切片进行计算(文本文档也可以按行),最终得到大文件的hash值(通过update方法拼接前面的字符串,直到文件最后。)

 1 # _*_ coding:utf-8 _*_
 2 import hashlib
 3 
 4 filename = "/root/hashtest.raw"
 5 
 6 fo = open(filename,'rb')
 7 md5obj = hashlib.md5()
 8 
 9 while True:
10     data = fo.read(8096)
11     if not data:
12         break
13     md5obj.update(data)
14     file_md5 = md5obj.hexdigest()
15     # print(file_md5)
16 
17 fo.close()
18 print(file_md5)

以上代码保存为文件hash_test.py,执行结果:

[root@ecs01 common_modules]# python3 hash_test.py 
6129ccf74f7a761e0c3e096e051ba7a2

 

Linux下计算结果:

1 [root@ecs01 ~]# md5sum hashtest.raw 
2 6129ccf74f7a761e0c3e096e051ba7a2  hashtest.raw

 

对比下Windows跟Python脚本执行结果:

windows 10:powershell

PS C:\Users\Administrator> Get-FileHash D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块\hashlib_test.avi -Algorithm MD5

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
MD5             AA63BB3AE73D4D66E555A1F350E19375                                       D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块\hashlib_test.avi

cmd.exe:

PS C:\Users\Administrator> Get-FileHash D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块\hashlib_test.avi -Algorithm MD5

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
MD5             AA63BB3AE73D4D66E555A1F350E19375                                       D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块\hashlib_test.avi

Python脚本计算结果:

 1 D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块>more hash_test.py
 2 # _*_ coding:utf-8 _*_
 3 import hashlib
 4 import os
 5 
 6 filename = "hashlib_test.avi"
 7 if not os.path.isfile(filename):
 8     print("File not exist.")
 9     exit(1)
10 
11 fo = open(filename,'rb')
12 
13 md5obj = hashlib.md5()
14 
15 while True:
16     data = fo.read(8096000)
17     if not data:
18         break
19     md5obj.update(data)
20     file_md5 = md5obj.hexdigest()
21     # print(file_md5)
22 fo.close()
23 
24 print(file_md5)

 

D:\PycharmProjects\pystudy\模块二-文件操作与函数\模块\常用模块>python hash_test.py
aa63bb3ae73d4d66e555a1f350e19375

 

以上三个环境下计算结果应该是一样的。

posted @ 2018-07-23 17:20  念宗  阅读(364)  评论(0编辑  收藏  举报