Hashlib Python模块的方法更新中的最大字节数限制

时间:2011-02-09 18:53:29

标签: python hashlib

我正在尝试使用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内存问题,但我不知道。

3 个答案:

答案 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)

缓冲区值是一次读取并存储在内存中的字节数,所以是的,唯一的限制是可用内存。

但是,较大的值不会自动更快。在某些时候,如果缓冲区太大,您可能会遇到内存分页问题或内存分配的其他减速问题。你应该尝试越来越大的值,直到你的速度收益递减为止。