Python中快速的64位确定性哈希

3

我之前一直在使用adler32来产生文本块的32位哈希值(然后将其用作文件名,以保存处理版本的缓存)。例如:

  hashed_file_name = adler32(pragraph.encode())

我想增加哈希大小,以减少碰撞的可能性(即两个不同的文本块获得相同的哈希代码,考虑到我有大约1000万个文本块,我认为在约0.2%的情况下会发生碰撞 - 即10 million / 2 ^ 32)。
我的问题是,哪种最快的哈希生成器可以产生至少64位的哈希?SHA1是否是一个有效的选择[它产生160位哈希]?即。
  hashed_file_name  = hashlib.sha1(pragraph.encode()).hexdigest()

虽然这对我的需求来说有些过度,但其他版本/选项在处理时间方面是否更加高效?


1
看一下PyHash库。它包含了MurmurHash 3(有32位和128位变体)以及Google的CityHash(有64位和128位变体)。 - kindall
1
这是一个不错的列表。https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions - recursive
为什么不使用Python内置的hash()函数?它在我的64位机器上生成了64位数字。我认为它非常快。 - Muposat
hash() 在 32 位 Python 上是 32 位的,看起来是这样,尽管这是一个可能会改变的实现细节。 - kindall
@kindall hash() 函数会在每次程序运行时产生不同的值。对于检查文件来说并不是很有用。 - SurpriseDog
1个回答

0

MD5是128位,不会增加依赖关系。它可能足够快,虽然你比我更了解你的需求。另一个想法是对数据进行排列(例如使用XOR或旋转),然后应用两次32位哈希。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接