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
以上三个环境下计算结果应该是一样的。