Python中的md5输出与命令行不同(即使在二进制模式下)

2 投票
2 回答
1545 浏览
提问于 2025-04-16 12:40

我正在写一个脚本,需要在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命令给改了,只能返回一个字符串的哈希值,而不是文件的哈希值。

撰写回答