2009-01-16 61 views
7

我需要一个查找表的哈希函数,因此,如果我的价值是从0到N,我需要一个哈希函数,给我一个值从0到n,为n < <ñ另一条信息是我已经事先知道了N个。成本非常低的哈希函数

我一直investigatinv约不同的低成本散列函数,我只有这个发现:

h = z mod n range(z) - 0 to N, range(h) - 0 to n 

我的哈希函数需要在硬件中实现,所以它需要有一个非常低的成本。任何人都可以推荐任何其他的公式或算法,除了那件简单的事情吗?当我说HW时,我的意思是在HW中真正实现,而不是在微处理器中的指令。

谢谢。

更新与解决方案

感谢所有的答案,我不会选择一个最喜欢的,因为这取决于目标应用程序的特点所有的人都同样有效。按随机顺序

+18

以下网页的通用Hash函数是有效的,并表现出最小的碰撞几种实现方式:http://www.partow.net/programming/hashfunctions/index.html – 2011-01-01 10:45:50

回答

1

重新布线位,并采取低log2(n)

或只采取低log2(n)位,如果你的数据是均匀分布的。

+0

向上投票hilariousness。 – 2013-05-04 21:43:24

2

CRC?

目前已经有很多硬件支持。

5

其规范形式是h(x) = (a*x + b) mod n,其中a和b是常数,n是散列表的大小。你想让n成为一个素数,以获得最优(ish)分布。

请注意,这对某种分布很敏感 - 例如,做x mod n主要依赖于低位的随机性;如果他们不是随机的,你会得到相当大的偏差。

鲍勃詹金斯设计了几个非常好的散列函数;这里有一个专门设计为简单的硬件实现: http://burtleburtle.net/bob/hash/nandhash.html

对于很多不同的散列函数,设计讨论等,看到网站的其余部分:http://burtleburtle.net/bob/hash/

+1

难道你不是指“......只是在做_x_模n主要是......”? – 2009-01-16 23:35:59

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; 
1

如果你真正谈话的硬件(与软件或硬件实现的软件),以及您的散列桶的数量n可以写成N = 2 - 1 ,最容易的可能是其中CRC是实例的最大长度为linear feedback shift register(LFSR)。

这里有一种方法可以使用m位移位寄存器来创建数据包的哈希值(确保所有数据一致地表示为K位字符串,如果您有更短的字符串,则将一端用零填充):

  1. 初始化LFSR的状态(CRC-32采用全1;全零可能是坏的)
  2. 移在你的数据位
  3. 在附加Ĵ零
  4. (可选)移(在m和2m之间的j可能是一个不错的选择);这增加了一些额外的哈希以减少输入/输出位之间的直接关联
  5. 使用m位移位寄存器的内容作为哈希值。