Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 极低成本散列函数_Hash_Lookup - Fatal编程技术网

Hash 极低成本散列函数

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主要依赖于低阶位的随机性;如果它们在你的集合中不是随机的,你会得

我需要一个用于查找表的哈希函数,这样,如果我的值是从0到N,我需要一个哈希函数,它给我一个从0到N的值,即N以随机顺序重新布线位,并取较低的
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位字符串,如果字符串较短,则用零填充一端):

  • 初始化LFSR的状态(CRC-32使用所有1;所有零可能都不好)
  • 数据位的移位
  • (可选)在额外的j零点中移动(m和2m之间的j可能是一个不错的选择);这增加了一些额外的散列,以减少输入/输出位之间的直接相关性
  • 使用m位移位寄存器的内容作为散列值

  • 你的意思是“…仅仅做x mod n基本上是…”吗?(a*x+b)mod n中的b不会影响任何事情,因为冲突的事情仍然会发生,而不冲突的事情仍然不会发生。下一页介绍了几种通用哈希函数的实现,这些函数效率高且冲突最小:
    h = (z * n) >> 8;