我目前的做法是这样的:
def get_hash(path=PATH, hash_type='md5'):
func = getattr(hashlib, hash_type)()
with open(path, 'rb') as f:
for block in iter(lambda: f.read(1024*func.block_size, b''):
func.update(block)
return func.hexdigest()
在 i5 @ 1.7 GHz 上计算 842MB iso 文件的 md5sum 大约需要 3.5 秒。我尝试了不同的读取文件的方法,但所有这些方法都会产生较慢的结果。也许有更快的解决方案?
编辑:我将2**16
(内部f.read()
)替换为1024*func.block_size
,因为block_size
hashlib 支持的大多数散列函数的默认值是64
(除了 'sha384' 和 'sha512' - 对于它们来说,默认值block_size
是128
)。因此,块大小仍然相同(65536 位)。
编辑(2):我做错了什么。它需要 8.4 秒而不是 3.5 秒。:(
编辑(3):当我再次运行该功能时,显然 Windows 正在以 +80% 的速度使用磁盘。真的需要3.5秒。呸。
另一种解决方案(~-0.5 秒,稍快)是使用 os.open():
def get_hash(path=PATH, hash_type='md5'):
func = getattr(hashlib, hash_type)()
f = os.open(path, (os.O_RDWR | os.O_BINARY))
for block in iter(lambda: os.read(f, 2048*func.block_size), b''):
func.update(block)
os.close(f)
return func.hexdigest()
请注意,这些结果不是最终结果。