python - 使用 Python 3 获取文件的杂音哈希

标签 python c python-3.x hash murmurhash

documentation对于 python 库,Murmur 有点稀疏。

我一直在尝试改编来自 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() 中的公共(public)方法是:

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

mmh3

'hash',
'hash64',
'hash_bytes'

没有updatehexdigest 方法..

有谁知道如何实现类似的结果?

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

更新 -

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

里面的公共(public)方法有:

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 中,无法真正理解它。这是一个 link to the line

所以现在将只使用 CRC-32,它应该几乎与此目的一样好,它是 well documented how to do it .如果有人发布解决方案,将对其进行测试。

最佳答案

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

import mmh3

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

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

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

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

murmur 是否可以实现渐进式哈希?
C 中有一个有效的实现:

关于python - 使用 Python 3 获取文件的杂音哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706164/

相关文章:

python - Dataframe多标签列表列到One-Hot

Python 多处理内置.IOError : [Errno 22] Invalid argument

python - 替换 .yml 文件中的一行的程序(PYTHON)

python - 如何在长时间运行的进程中运行 coverage.py?

c - 在 C99 中指向数组开始之前的元素

python - 以两个(或更多)其他变量为条件指定 `str` 的更优雅方式

python - 如何在 Python 中执行单尾双样本 Kolmogorov–Smirnov 检验?

python - 从 Python 中的列表计算次相反均值

c - 发送文件(客户端到服务器和服务器到客户端)

c - C中的文件读取问题