在Python中计算快速、非密码安全的文件哈希

2024-04-19 16:34:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python(123)中,对计算文件散列的堆栈溢出有一些很好的讨论,包括太大而无法放入内存的文件。最终的解决方案是这样的(从#3中稍加编辑):

def md5_file(path, size):
    m = hashlib.md5()
    with open(path, 'rb') as f:
        b = f.read(size)
        while len(b) > 0:
            m.update(b)
            b = f.read(size)
    return m.digest()

如果您不需要哈希函数是加密安全的(我不需要),那么就有pyfasthash(看起来也叫pyhash),正如here所讨论的。不幸的是,pyfasthash的哈希类缺少上面使用的update方法。我还没有很幸运地弄清楚还能做些什么;Python-C代码混合体我无法理解。我只是把整个文件读入记忆,就像这样:

with open(path, 'rb') as afile:
    return hasher(afile.read())

这种方法的缺点是:

  1. 这个文件必须放在内存中
  2. 比较慢。根据#3,您希望一次加载到内存中的文件量足够小,以避免页面交换(海报的机器上大约64KiB)。你知道吗

有什么方法可以让我更快地计算文件的哈希值吗?你知道吗


Tags: 文件path方法内存readsizereturnas