纠正大整数的哈希函数,还是应该将它们转换为字符串?

时间:2011-08-08 03:41:56

标签: performance algorithm hash

我有一个应用程序,其中每个元素由唯一的32位数字标识,即“密钥”。我主要担心的是查找哈希表中的任何特定键来获取附加元素的速度。我对哈希表的选择是ELF,PJW和BKDR。安全性不是问题所以在这种情况下,哪些哈希算法会创建一个具有最佳查找速度的表?

另一个考虑因素。如果我将数字转换为字符串表示并将其用于密钥,我会获得更好的性能吗?

注意:我确实找到了这个相关的SO线程:

What integer hash function are good that accepts an integer hash key?

但是接受的答案在评论中有一些相反的观点似乎是合理的,并且所有其他答案中的警告和意见的传播让我仍然不确定我的用例场景的最佳算法。

3 个答案:

答案 0 :(得分:3)

找到一个好的,快速的哈希函数的问题已经解决:http://code.google.com/p/smhasher/wiki/MurmurHash3

基于数学技巧(如Knut的乘法散列)的散列函数的时间结束了。现代哈希使用二进制运算。

也许你可以只取你已经拥有的整数而不是哈希它。如果碰撞太多(仅因某些特殊数据分布而发生),请使用MurmurHash。

答案 1 :(得分:0)

转换为字符串并散列字符串可能会很慢。对于一个简单的哈希函数,我倾向于将大的(多大的?)数字分成32位块并将块一起异或。

答案 2 :(得分:0)

只需使用字典。由于每个元素都由“唯一”32位数字标识,因此散列集不是您要查找的数据结构。您正在寻找键值对字典。