我正在尝试使用hashlib模块中的函数 hashlib.md5()来计算文件的md5哈希值。
所以我写了这段代码:
Buffer = 128
f = open("c:\\file.tct", "rb")
m = hashlib.md5()
while True:
p = f.read(Buffer)
if len(p) != 0:
m.update(p)
else:
break
print m.hexdigest()
f.close()
我注意到如果我用64,128,256等增加Buffer变量值,函数更新会更快。 有一个我不能超过的上限?我想它可能只是RAM内存问题,但我不知道。
答案 0 :(得分:3)
大(≈2**40
)块大小导致MemoryError
,即除了可用RAM之外没有其他限制。另一方面bufsize
在我的机器上被2**31-1
限制:
import hashlib
from functools import partial
def md5(filename, chunksize=2**15, bufsize=-1):
m = hashlib.md5()
with open(filename, 'rb', bufsize) as f:
for chunk in iter(partial(f.read, chunksize), b''):
m.update(chunk)
return m
大chunksize
可能和非常小的一样慢。测量它。
我发现对于≈10
MB文件,2**15
chunksize
对我测试的文件来说速度最快。
答案 1 :(得分:2)
为了能够处理任意大的文件,您需要在块中读取它们。这些块的大小最好是2的幂,而在md5的情况下,最小可能块由64个字节(512位)组成,因为512位块是算法运行的单位。
但是,如果我们超越它并尝试建立一个确切的标准,比如2048字节块是否更好而不是4096字节块...我们可能会失败。这需要经过仔细测试和测量,从经验来看,几乎总是随意选择价值。
答案 2 :(得分:0)
缓冲区值是一次读取并存储在内存中的字节数,所以是的,唯一的限制是可用内存。
但是,较大的值不会自动更快。在某些时候,如果缓冲区太大,您可能会遇到内存分页问题或内存分配的其他减速问题。你应该尝试越来越大的值,直到你的速度收益递减为止。