3

我正在尝试使用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()

我注意到如果我将 Buffer 变量值增加 64、128、256 等,函数更新会更快。有不能超过的上限?我想这可能只是 RAM 内存问题,但我不知道。

4

3 回答 3

3

大 (≈<code>2**40) 块大小导致MemoryError即,除了可用 RAM 之外没有限制。另一方面bufsize2**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的可以和非常小的一样慢。测量它。

我发现对于 ≈<code>10MB 文件,2**15 chunksize对于我测试过的文件来说是最快的。

于 2011-02-11T00:38:42.240 回答
2

为了能够处理任意大的文件,您需要分块读取它们。这些块的大小最好是 2 的幂,在 md5 的情况下,最小可能的块由 64 个字节(512 位)组成,因为 512 位块是算法运行的单位。

但是,如果我们超越这一点并尝试建立一个确切的标准,例如 2048 字节块是否优于4096 字节块......我们可能会失败。这需要非常仔细地测试和测量,并且几乎总是根据经验来随意选择值。

于 2011-02-09T19:04:52.410 回答
0

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

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

于 2011-02-09T19:01:22.077 回答