您的位置:首页 > 编程语言 > Python开发

python 计算文件的MD5

2013-08-05 16:15 459 查看
一、使用python自带的hash库hashlib

对于大文件,不能简单的一次载入内存,需要对文件分片不断的update完成(代码中如果文件超过100M,就需要分片了)。具体代码如下:

import os
import sys
import hashlib

_FILE_SLIM = (100*1024*1024) # 100MB

def file_md5(filename):
calltimes = 0
hmd5 = hashlib.md5()
fp = open(filename,"rb")
f_size = os.stat(filename).st_size
if f_size>_FILE_SLIM:
while(f_size>_FILE_SLIM):
hmd5.update(fp.read(_FILE_SLIM))
f_size/=_FILE_SLIM
calltimes += 1   #delete
if(f_size>0) and (f_size<=_FILE_SLIM):
hmd5.update(fp.read())
else:
hmd5.update(fp.read())

return (hmd5.hexdigest(),calltimes)

if __name__ == '__main__':
if len(sys.argv) == 2:
filepath = os.path.abspath(sys.argv[1])
(hvalue,ctimes) = file_md5(filepath)
print(hvalue)


二、测试
从meizu官网上下了个固件更新包,检测测试了下,没有问题。

测试执行:python calc_file_md5.py filename

三、更新下代码

可以计算hashlib中所有的所有的hash值,包括:md5, sha1, sha224, sha256, sha384, sha512.

主要思路是:采用字典结构来存储hash函数,达到泛型。

代码如下:

# coding=gbk
__doc__ = '''
filehash.py md5/sha1/sha224/sha256/sha384/sha512 targetfile
argc must be equal to 3
'''

import os
import hashlib

__supported_hashfunc = {'md5':hashlib.md5, 'sha1':hashlib.sha1, 'sha224':hashlib.sha224, 'sha256':hashlib.sha256, 'sha384':hashlib.sha384, 'sha512':hashlib.sha512}
__FILE_SLIM = (100*1024*1024) # 100MB

def filehash(hfunc,filename):
hobj = hfunc()
fp = open(filename,"rb")
f_size = os.stat(filename).st_size
while(f_size > __FILE_SLIM):
hobj.update(fp.read(__FILE_SLIM))
f_size /= __FILE_SLIM
#print("o.o")
if(f_size>0) and (f_size <= __FILE_SLIM):
hobj.update(fp.read())
fp.close()
return hobj.hexdigest()

def main():
import sys
if len(sys.argv) == 3:
try:
hfunc = __supported_hashfunc[sys.argv[1].lower()]
#print(sys.argv[1])
filepath = os.path.abspath(sys.argv[2])
hvalue = filehash(hfunc,filepath)
print(sys.argv[1],hvalue,sep=':')
except KeyError:
print('''input cmd:"%s" is error'''%sys.argv[1])
else:
print(__doc__)
if __name__ == '__main__':
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: