Python中的md5输出与命令行不同(即使在二进制模式下)
我正在写一个脚本,需要在OSX和Windows上检查一个文件的md5值。为了确认结果的准确性,我用命令行的md5
工具进行了对比,但结果却不一样。以下是我的代码:
def MD5File(self, f, block_size=2**20):
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
return md5.hexdigest()
with open(path, 'rb') as f:
print MD5File(path)
我当然是以二进制模式打开文件,但结果还是不一样。我尝试了不同的数据缓冲方式,包括一次性读取所有内容,然而这个Python脚本每次返回的结果都是一样的,但和md5命令的结果不同。
所以,我是不是做错了什么很明显的事情,还是说运行md5 filename
并没有像你想的那样工作?因为我直接读取文件的二进制内容,所以应该不会有换行符的问题。如果我运行cat filename | md5
,结果又会不同。
2 个回答
4
以下代码对我来说运行得很好:
In [1]: with file("play.py") as f:
...: data = f.read()
...: from hashlib import md5
...: print(md5(data).hexdigest())
...:
07030b37de71f3ad9ef2398b4f0c3a3e
In [2]:
bensonk@angua ~ $ md5 play.py
MD5 (play.py) = 07030b37de71f3ad9ef2398b4f0c3a3e
请试试我的代码,看看它对你是否有效。如果不行的话,你能上传一个gist,里面包含你的Python脚本和一个示例文件让我试试吗?
0
哎呀,这其实是用户操作失误。我把命令行中的md5
命令给改了,只能返回一个字符串的哈希值,而不是文件的哈希值。