本文作者:念宗

hashlib与Linux中的md5sum

念宗 6年前 ( 2018-11-20 ) 4717 抢沙发
摘要: Linux中计算文件或者字符串的md5值有一个工具叫做md5sum,其用法为:[root@ecs01 ~]# md5sum ConcisePro2.1...

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

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

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

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

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

 # _*_ coding:utf-8 _*_ 

 import hashlib 

  

 filename = "/root/hashtest.raw" 

  

 fo = open(filename,'rb') 

 md5obj = hashlib.md5() 

  

 while True:

     data = fo.read(8096)

     if not data:

         break

     md5obj.update(data)

     file_md5 = md5obj.hexdigest()

     # print(file_md5)

 

 fo.close()

 print(file_md5)


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

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

 

Linux下计算结果:

[root@ecs01 ~]# md5sum hashtest.raw 
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脚本计算结果:

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

# _*_ coding:utf-8 _*_

import hashlib

import os


filename = "hashlib_test.avi"

if not os.path.isfile(filename):

    print("File not exist.")

    exit(1)


fo = open(filename,'rb')


md5obj = hashlib.md5()


while True:

    data = fo.read(8096000)

    if not data:

        break

    md5obj.update(data)

    file_md5 = md5obj.hexdigest()

    # print(file_md5)

fo.close()


print(file_md5)

 

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

 

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


文章版权及转载声明:

作者:念宗本文地址:http://pyops.net/?id=30发布于 6年前 ( 2018-11-20 )
文章转载或复制请以超链接形式并注明出处运维之道

分享到: 网站分享代码

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

快捷回复:

验证码

评论列表 (暂无评论,4717人围观)参与讨论

还没有评论,来说两句吧...