具有低碰撞率的快速字符串哈希算法(使用32位整数)

70

我有很多不相关的命名事物,想要进行快速搜索。 "土豚" 在任何地方都是 "土豚",因此对字符串进行哈希处理并重复使用整数可用于加快比较速度。整个名称集合未知(而且随时间变化)。有什么快速的字符串哈希算法可以生成小的(32或16位)值并具有低碰撞率?

我想看到一个特定于C/C++的优化实现。


请添加关键字:哈希算法、唯一、低碰撞。 - slashmais
24
以下页面提供了几种通用哈希函数的实现,这些函数具有高性能和低碰撞率: http://partow.net/programming/hashfunctions/index.html - Matthieu N.
14个回答

2
您可以使用Reflector查看.NET在String.GetHashCode()方法中使用了什么。
我猜微软公司花费了相当长的时间来优化这个方法。他们在所有的MSDN文档中都打印出了它是随时可能更改的信息。因此,很明显它在他们的“性能调整雷达”上;-)
将其移植到C++也应该是相当简单的。

2

完美哈希生成器太棒了! - C. K. Young
5
这个应用不适合使用完美哈希,因为名称集合是未知并且会发生变化。因此,gperf 不适用于此。 - TimB

-1
这里描述了一种简单的实现方法:http://www.devcodenote.com/2015/04/collision-free-string-hashing.html 文章摘录如下:
假设我们有一个由大写英文字母组成的字符集,那么字符集的长度为26,其中A可以用数字0表示,B可以用数字1表示,C可以用数字2表示,以此类推,Z可以用数字25表示。现在,每当我们想将该字符集的字符串映射到唯一的数字时,我们执行与二进制格式相同的转换。

如果有一个可以显示链接内容的超文本浏览器,那么如何将其映射到(32或16)位值,假设字符集从24到1,111,998个代码点?基本转换不是一个有用的哈希函数。 - greybeard

-3

CRC-32。在谷歌上有大约一万亿个链接跟它相关。


8
CRC(循环冗余校验)是用于错误检测和纠正的。它们的分布特性通常不是很好。 - Nick Johnson
1
Arachnid 显然从未尝试过将 CRC32 用作哈希值。它们效果很好。 - Nils Pipenbrinck
10
CRC32并不是为哈希表使用而设计的。实际上,没有什么好的理由将其用于此目的。 参考:http://home.comcast.net/~bretm/hash/8.html - obecalp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接