使用Python 3获取文件的杂项哈希

时间:2018-10-08 16:04:06

标签: python c python-3.x hash murmurhash

Python库Murmur的documentation有点稀疏。

我一直在尝试改编this答案中的代码:

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方法。

有人知道如何获得类似的结果吗?

动机是尽快测试唯一性,结果here表明杂音是不错的选择。

更新-

在@Bakuriu的评论之后,我看了一下mmh3,它似乎记录得更好。

其中的公共方法是:

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

.. so没有“更新”方法。我看了mmh3.hash_from_buffer的源代码,但它看起来不像包含一个循环,并且也不在Python中,因此无法真正遵循它。这是link to the line

因此,目前仅使用CRC-32,它应该是达到目的的,它是well documented how to do it。如果有人发布了解决方案,则会对其进行测试。

1 个答案:

答案 0 :(得分:0)

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

import mmh3

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

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

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

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

通过 murmur 是否可以进行渐进式散列?
在 C 中有一个工作实现: