Hash 极低成本散列函数
我需要一个用于查找表的哈希函数,这样,如果我的值是从0到N,我需要一个哈希函数,它给我一个从0到N的值,即N以随机顺序重新布线位,并取较低的Hash 极低成本散列函数,hash,lookup,Hash,Lookup,我需要一个用于查找表的哈希函数,这样,如果我的值是从0到N,我需要一个哈希函数,它给我一个从0到N的值,即N以随机顺序重新布线位,并取较低的log2(N)位 或者,如果数据分布均匀,只需取较低的log2(n)位。CRC 这方面已经有很多硬件支持。其标准形式是h(x)=(a*x+b)mod n,其中a和b是常量,n是哈希表的大小。您希望使n成为一个素数,以获得最佳(ish)分布 注意,这对某些类型的分布很敏感——例如,仅仅做xmodn主要依赖于低阶位的随机性;如果它们在你的集合中不是随机的,你会得
log2(N)
位
或者,如果数据分布均匀,只需取较低的log2(n)
位。CRC
这方面已经有很多硬件支持。其标准形式是
h(x)=(a*x+b)mod n
,其中a和b是常量,n是哈希表的大小。您希望使n
成为一个素数,以获得最佳(ish)分布
注意,这对某些类型的分布很敏感——例如,仅仅做xmodn
主要依赖于低阶位的随机性;如果它们在你的集合中不是随机的,你会得到相当大的偏差
Bob Jenkins设计了几个非常好的散列函数;下面是一个专门设计的易于在硬件中实现的:
有关许多不同的哈希函数、设计讨论等,请参阅网站的其余部分:我认为这是解决此问题的最佳哈希(比模更快,分布更好),因为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的幂,则可以通过移位替换除法。e、 g.如果N=256:
h = (z * n) >> 8;
如果您真正谈论的是硬件(与软件或软件的硬件实现相比),并且您的哈希桶数n可以写为n=2m-1,最简单的可能是最大长度(LFSR),其中CRC是一个实例 这里有一种方法可以使用m位移位寄存器创建数据包的散列(确保所有数据一致地表示为K位字符串,如果字符串较短,则用零填充一端):
你的意思是“…仅仅做x mod n基本上是…”吗?(a*x+b)mod n中的b不会影响任何事情,因为冲突的事情仍然会发生,而不冲突的事情仍然不会发生。下一页介绍了几种通用哈希函数的实现,这些函数效率高且冲突最小:
h = (z * n) >> 8;