文本数据的最快哈希算法

15

我正在尝试选择一个哈希算法,在比较大约20个不同的文本数据时使用。

哪种哈希算法更适合这些要求?

  • CPU消耗少
  • 小型 (<=32字节)
  • 冲突不是很严重
  • 可以从.NET Framework 2中生成(不应该是第三方库)

我使用哈希用于占用更少的内存,提高比较性能。


你能详细说明一下“可以从.NET Framework 2生成”是什么意思吗?你是指已经存在于BCL中的内容,还是指可以轻松自行实现的内容也可以接受? - Robert Gamble
你能澄清一下“可以从.NET Framework 2生成(不应该是第三方库)”的意思吗?你是指“哈希本身必须由框架中存在的算法生成”还是“算法必须由框架中的类型生成”? - Greg Dean
我指的是使用本地函数或库,而不是外部的大型项目或 DLL 依赖。 - dr. evil
21
你考虑过使用以下一种或多种通用哈希函数吗:http://www.partow.net/programming/hashfunctions/index.html,它们非常快速和高效。 - Matthieu N.
8个回答

9

如果碰撞不是什么大问题,您可以使用每个文档的第一个字母。或者您还可以使用文本长度或文本中的字符串。


或者是使用前(几个)字符和长度的组合作为哈希值。当然,你也可以将整个字符串作为哈希值。 =] - strager
3
实际上,这听起来是合理的。 - dr. evil

7

Paul Hsieh有一个不错的、简单快速的32位SuperFastHash,比大多数现有的哈希函数表现更好,更容易理解和实现,并且似乎符合你的标准。


我自己在哈希映射中使用过这个方法,对于我的情况来说它非常有效(冲突很少)。 - strager
5
听说这个人是某种天才。他的哈希函数非常牛逼! :) - Paul Hsieh
8
@paul: 不,他不是天才,只是自我营销做得很好 :) - Matthieu N.

4

FNV哈希是一个著名的快速哈希算法。它不是加密安全的,但如果您不需要安全哈希,它听起来是可以使用的。


BCL 中是否有 FNV 实现? - Greg Dean
有一个BCL团队的博客文章涉及到这个问题:http://blogs.msdn.com/bclteam/archive/2003/10/31/49719.aspx - Greg Hewgill

2

一个非常快速的检查方法是,将文本的长度与其前4个字节进行异或运算,并将结果用作哈希值。如果这足够好,那么它非常快速,因为它与文件的字节数无关。


0

它很小,但CPU使用效率并不高,我宁愿使用MD4(作为非常明显的选择)或类似的CRC32。 - dr. evil
没错。我感到困惑是因为通常会显示为32位十六进制数。 - Bill the Lizard
据我所知,BCL中都没有实现MD4或CRC32。如果不想自己编写代码或使用第三方库,只需支付15%的税费即可方便地使用MD5。 - Greg Dean


0
哈希表需要保持多久?GetHashCode()非常易于访问,给出了一个小的响应(4个字节),这应该足够处理20个字符串时减少冲突。
但是,GetHashCode()不应该被持久化到数据库中-它对于内存比较是可以的。只需注意算法可能在框架之间改变(并且在1.1和2.0之间确实改变了)。
另一个好处是它很容易使用-只需使用Dictionary<string,Something>,它将为您处理所有散列等操作。

如果我使用dictionary<string,smt>,我会认为它会将整个字符串存储在内存中。 - dr. evil
是的,但是哈希表如果不进行实际的相等性检查,总是存在碰撞的风险。 - Marc Gravell

0

我自己也有同样的需求,然后我实现了xxHashSharp。只要确保你选择了适当的库(x32 vs x64)。它也可以在C#之外使用这里


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