- 使用内置的
hash()
函数。 这个函数,在我正在开发的机器上(使用Python 2.7和64位CPU)产生的整数可以适合32位 - 对我的目的来说不够大。 - 使用 hashlib。 hashlib 提供了加密哈希例程,但非加密情况下速度要慢得多。我认为这是不言而喻的,但如果您需要基准测试和引用来使您相信这一点,那么我可以提供。
- 将
string.__hash __()
函数用作原型编写自己的函数。 我怀疑这将是正确的方法,但是该特定函数的效率在于其对c_mul函数的使用,该函数封装在32位周围 - 再次,对我的使用来说太小了!非常令人沮丧,离完美只有一步之遥!
理想的解决方案应具有以下特性,以相对宽松的重要性顺序列出。
- 输出范围至少需要扩展到34位长,可能是64位,并保持所有位上的一致avalanche特性。(串接32位哈希往往会违反avalanche属性,至少在我的愚蠢示例中是这样。)
- 可移植。在两台不同的机器上给定相同的输入字符串,应该得到相同的结果。这些值将存储在文件中以供以后重用。
- 高性能。越快越好,因为在程序执行期间调用此函数大约20亿次(目前是性能关键代码)。它不需要用C编写,它真的只需要胜过md5(在字符串的内置哈希中的某个地方)。
- 接受'扰动'(在这里使用什么更好的词?)整数作为输入以修改输出。我在下面放了一个示例(列表格式规则不允许我将其放得更近)。我想这并不是100%必要的,因为可以通过手动扰动函数的输出来模拟它,但是将其作为输入使我感觉很好。
- 完全使用Python编写。如果绝对,肯定需要使用C编写,那么我想这可以完成,但是对于使用两种不同语言的项目协调头痛来说,我会接受用Python编写的速度慢20%的函数。是的,这很拍脑袋,但这是一个心愿单。
'扰动'哈希示例,其中哈希值受小整数值n的剧烈更改
def perturb_hash(key,n):
return hash((key,n))
最后,如果你好奇我在做什么需要如此特定的哈希函数,我正在完全重写pybloom模块以大大提高其性能。我成功地完成了这个任务(现在它运行速度约快4倍,使用的空间约为原来的50%),但我注意到有时候如果过滤器足够大,误报率会突然上升。我意识到这是因为哈希函数没有足够的位数。32位只能寻址40亿个位(注意,过滤器寻址的是位而不是字节),而我用于基因组数据的一些过滤器会加倍以上(因此需要至少34位)。
谢谢!
hash(s) * 2**32 + hash(s+s)
是否有问题?如果hash
足够好的话,那么这就足够好了,对吗?假设hash(s+s)
与hash(s)
没有明显的关联,那么您将在所有输出位上获得雪崩效应。如果由于内存分配而不够快,您可以使用C编写代码来将哈希算法应用于s+s
,但实际上不执行字符串连接。 - Steve Jessop