【发布时间】:2011-12-11 09:14:13
【问题描述】:
在 python 2.7 中,以下代码计算文件内容的 mD5 hexdigest。
(编辑:嗯,不是真的如答案所示,我只是这么认为)。
import hashlib
def md5sum(filename):
f = open(filename, mode='rb')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf)
return d.hexdigest()
现在,如果我使用 python3 运行该代码,它会引发 TypeError 异常:
d.update(buf)
TypeError: object supporting the buffer API required
我发现我可以通过将 python2 和 python3 更改为:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
现在我仍然想知道为什么原始代码停止工作。似乎当使用二进制模式修饰符打开文件时,它返回整数而不是编码为字节的字符串(我这么说是因为 type(buf) 返回 int)。这种行为是否在某处解释过?
【问题讨论】:
-
如果你进行更大的读取会更快,更接近文件系统的文件块大小吗? (例如,Linux ext3 上为 1024 字节,Windows NTFS 上为 4096 字节或更多)
标签: python python-3.x hashlib