首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极低成本散列函数

极低成本散列函数
EN

Stack Overflow用户
提问于 2009-01-16 21:53:08
回答 4查看 3K关注 0票数 9

我需要一个查找表的哈希函数,所以如果我的值从0到N,我需要一个哈希函数,它给我一个从0到N的值,作为n << N。另一条信息是我已经预先知道了N。

我一直在研究不同的低成本散列函数,我只发现:

代码语言:javascript
运行
复制
h = z mod n  range(z) - 0 to N, range(h) - 0 to n

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

谢谢。

使用解决方案更新

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

EN

回答 4

Stack Overflow用户

发布于 2009-01-16 22:20:46

它的规范形式是h(x) = (a*x + b) mod n,其中a和b是常量,n是哈希表的大小。您希望使n成为素数,以获得最优(Ish)分布。

请注意,这对某些类型的分布非常敏感--例如,仅仅执行x mod n主要依赖于低阶位的随机性;如果它们在您的集合中不是随机的,您将得到相当大的偏差。

Bob设计了几个非常好的散列函数;这里有一个专门设计成易于在硬件中实现的函数:http://burtleburtle.net/bob/hash/nandhash.html

有关许多不同的散列函数、设计讨论等,请参阅站点的其余部分:http://burtleburtle.net/bob/hash/

票数 5
EN

Stack Overflow用户

发布于 2009-01-16 22:12:36

CRC?

这方面已经有很多硬件支持。

票数 3
EN

Stack Overflow用户

发布于 2009-01-16 22:22:21

我相信这是解决这个问题的最好的散列(比模更快,分布更好),考虑到0.N中的所有数字都有相同的概率:

代码语言:javascript
运行
复制
h = z * n / N;

这里所有的值都是整数,所以你有一个整数除法。这样,0. n之间的每个值都映射到n中相同数目的值。

例如,当n=3和N=7 (值3和7不在范围内)时,散列如下:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
h = (z * n) >> 8;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/452186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档