3

python 库 Murmur的文档有点稀疏。

我一直在尝试从这个答案中调整代码:

import hashlib
from functools import partial

def md5sum(filename):
    with open(filename, mode='rb') as f:
        d = hashlib.md5()
        for buf in iter(partial(f.read, 128), b''):
            d.update(buf)
    return d.hexdigest()

print(md5sum('utils.py'))

根据我在答案中读到的内容,md5 不能一次对整个文件进行操作,所以它需要这个循环。但是,不确定在线上会发生什么d.update(buf)

中的公共方法hashlib.md5()是:

 'block_size',
 'copy',
 'digest',
 'digest_size',
 'hexdigest',
 'name',
 'update'

mmh3

'hash',
'hash64',
'hash_bytes'

没有updatehexdigest方法..

有谁知道如何达到类似的结果?

动机是尽可能快地测试唯一性,这里的结果表明杂音是一个很好的候选者。

更新 -

根据@Bakuriu 的评论,我查看了mmh3似乎有更好的文档记录。

它里面的公共方法是:

import mmh3
print([x for x in dir(mmh3) if x[0]!='_'])
>>> ['hash', 'hash128', 'hash64', 'hash_bytes', 'hash_from_buffer']

..所以没有“更新”方法。我查看了源代码,mmh3.hash_from_buffer但它看起来不像包含循环,而且它也不在 Python 中,无法真正遵循它。这是该行的链接

因此,现在只使用 CRC-32,它应该几乎与此目的一样好,并且有据可查如何做到这一点。如果有人发布解决方案,将对其进行测试。

4

1 回答 1

1

要使用 murmur 对文件进行哈希处理,必须将其完全加载到内存中并一次性进行哈希处理。

import mmh3

with open('main.py') as file:
    data = file.read()

hash = mmh3.hash_bytes(data, 0xBEFFE)
print(hash.hex())

如果您的文件太大而无法放入内存,您可以使用增量/渐进散列:将数据添加到多个块中并动态散列它们(如上面的示例)。

是否有用于杂音渐进式散列的 Python 库?
我试图找到一个,但似乎没有。

杂音甚至可以进行渐进式哈希吗?
C中有一个工作实现:

于 2021-01-06T11:12:36.433 回答