我需要一个python中的高性能字符串哈希函数,该函数生成的整数的输出位至少为34位(64位是有意义的,但32位太少)。在堆栈溢出上还有其他一些类似的问题,但在我能找到的每一个被接受/投票的答案中,都属于少数几个类别中的一个,它们不适用(出于给定的原因)
hash()
函数。这个函数,至少在我正在开发的机器上(使用Python2.7和64位cpu)会生成一个适合32位的整数-对于我来说不够大。string.__hash__()
函数作为原型来编写您自己的函数。我怀疑这是正确的方法,只是这个特定函数的效率在于它使用了c_mul函数,该函数包绕32位-同样,对我来说太小了!非常令人沮丧,它是如此接近完美!一个理想的解决方案将具有以下性质,以相对松散的重要性顺序排列。
“扰动”哈希示例,其中哈希值被一个小整数值n剧烈更改
def perturb_hash(key,n):
return hash((key,n))
最后,如果您想知道我到底在做什么,我需要这样一个特定的哈希函数,我正在对pybloom模块进行完全的重新编写,以大大提高其性能。我成功地做到了这一点(现在它的运行速度提高了4倍左右,占用了大约50%的空间),但我注意到,有时如果滤波器变得足够大,它的假阳性率就会突然飙升。我意识到这是因为哈希函数没有处理足够的位。32位只能处理40亿位(请注意,过滤器只处理位而不是字节)和一些我用于基因组数据的过滤器是这个数字的两倍或更多(因此最少34位)
谢谢!
“strings”:我假设您希望散列Python 2.x
str
对象和/或Python3.xbytes
和/或bytearray
对象。这可能违反了您的第一个约束,但是:请考虑使用
获取(32+N)位哈希。
那不是真的。内置哈希函数将在64位系统上生成64位哈希。
这是来自
Objects/stringobject.c
(python版本2.7)的python str哈希函数:看看128-bit variant of MurmurHash3。algorithm's page包含一些性能数字。应该可以将它移植到Python,pure或作为C扩展。(已更新作者建议使用128位变量,并丢弃不需要的位)。
如果murrushash2 64位对您有效,那么pyfasthash package中有一个Python实现(C扩展),其中包括一些其他的非加密散列变量,尽管其中一些仅提供32位输出。
更新我为murdur3散列函数做了一个快速的Python包装器。{a4},你可以在Python Package Index as well上找到它,它只需要一个C++编译器来编译;不需要任何提升。
使用示例和计时比较:
输出:
相关问题 更多 >
编程相关推荐