9

我需要一个查找表的散列函数,所以如果我的值是从 0 到 N,我需要一个散列函数给我一个从 0 到 n 的值,即 n << N。另一条信息是我已经提前知道N。

我一直在研究不同的低成本哈希函数,但我发现只有这个:

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

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

谢谢你。

更新解决方案

感谢所有答案,我不会选择最喜欢的一个,因为根据目标应用程序的特性,它们都同样有效。

4

5 回答 5

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/

于 2009-01-16T22:20:46.863 回答
3

CRC?

对此也已经有很多硬件支持。

于 2009-01-16T22:12:36.690 回答
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;
于 2009-01-16T22:22:21.117 回答
1

如果您真正谈论的是硬件(相对于软件,或软件的硬件实现),并且您的哈希桶数 n 可以写为 n = 2 m - 1,那么最简单的可能是最大长度线性反馈移位寄存器( LFSR),其中 CRC 是一个实例。

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

  1. 初始化 LFSR 的状态(CRC-32 使用全 1;全零可能不好)
  2. 转移数据位
  3. (可选)移动额外的 j 个零(j 在 m 和 2m 之间可能是一个不错的选择);这增加了一些额外的散列以减少输入/输出位之间的直接相关性
  4. 使用 m 位移位寄存器的内容作为散列值。
于 2009-01-16T22:56:29.020 回答
1

log2(n)以随机顺序重新连接位并取低位

log2(n)或者,如果您的数据分布均匀,则只需使用较低的位。

于 2009-01-16T21:55:41.373 回答