我需要查找表的哈希函数,这样如果我的值从0到N,我需要一个哈希函数给出一个从0到n的值,即n<< N.另一条信息是我已事先知道N.
我一直在研究不同的低成本哈希函数,我只发现了这个:
h = z mod n range(z) - 0 to N, range(h) - 0 to n
我的哈希函数需要在HW中实现,因此需要具有非常低的成本。任何人都可以推荐除了那个简单的东西之外的任何其他公式或算法吗当我说硬件时,我指的是硬件中的真正实现,而不是微处理器中的指令。
谢谢。
使用解决方案进行更新
感谢所有答案,我不会选择最喜欢的答案,因为根据目标应用程序的特性,它们都同样有效。
答案 0 :(得分:5)
它的规范形式是h(x) = (a*x + b) mod n
,其中a和b是常量,n是哈希表的大小。您希望将n
设为素数,以获得最佳(ish)分布。
请注意,这对某种分布很敏感 - 例如,只做x mod n
主要依赖于低阶位的随机性;如果它们在你的集合中不是随机的,你会得到相当大的偏差。
Bob Jenkins设计了几个非常好的散列函数;这是一个专门设计用于在硬件中实现的简单方法: http://burtleburtle.net/bob/hash/nandhash.html
对于许多不同的哈希函数,设计讨论等,请参阅网站的其余部分:http://burtleburtle.net/bob/hash/
答案 1 :(得分:2)
CRC
此外已经有很多硬件支持。
答案 2 :(得分:2)
我认为这是这个问题的最佳哈希值(比模数更快,分布更好),因为0..N中的所有数字具有相同的概率:
h = z * n / N;
如果所有值都是整数,那么您有一个整数除法。这样,0..N之间的每个值都映射到n中完全相同的值。
例如,当n = 3且N = 7(值3和7未包括在范围内)时,散列是这样的:
z * n / N = hash
----------------
0 * 3 / 7 = 0
1 * 3 / 7 = 0
2 * 3 / 7 = 0
3 * 3 / 7 = 1
4 * 3 / 7 = 1
5 * 3 / 7 = 2
6 * 3 / 7 = 2
因此,每个哈希值的使用频率相同,只是关闭1.请注意n*(N-1)
不会溢出。
如果N是2的幂,则可以通过移位替换除法。例如如果N = 256:
h = (z * n) >> 8;
答案 3 :(得分:1)
以随机顺序重新连接位并采用较低的log2(n)
位
如果您的数据均匀分布,则只需降低log2(n)
位。
答案 4 :(得分:1)
如果您真的在谈论硬件(与软件或软件的硬件实现相比),并且您的散列桶数n可以写为n = 2 m - 1,最简单的是可能是CRC为实例的最大长度linear feedback shift register(LFSR)。
这里有一种方法可以使用m位移位寄存器来创建数据包的散列(确保所有数据一致地表示为K位字符串,如果你有较短的字符串,则用一个零填充一端) :