【问题标题】:Fastest Hash Algorithm for Text Data文本数据的最快哈希算法
【发布时间】:2010-09-27 22:35:44
【问题描述】:

我正在尝试选择一种哈希算法来比较最多 20 个不同的文本数据。

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

  • CPU 消耗更少
  • 占用空间小(
  • 碰撞不是什么大问题
  • 可以从 .NET Framework 2 生成(不应是第 3 方库)

我使用哈希来减少内存占用和比较性能

【问题讨论】:

  • 您能否详细说明“可以从 .NET Framework 2 生成”是什么意思,您是指 BCL 中已经存在的东西还是可以自己轻松实现的东西可以接受?跨度>
  • 您能否澄清“可以从 .NET Framework 2 生成(不应该是第 3 方库)”您的意思是“哈希本身必须从框架中存在的算法生成”还是“算法必须从框架中的类型生成”?
  • 我的意思是一个本地函数或库,而不是一个外部巨大的项目或 DLL 依赖项。
  • 您是否考虑过使用以下一种或多种通用哈希函数:partow.net/programming/hashfunctions/index.html 它们非常快速且高效。

标签: .net performance hash


【解决方案1】:

如果您受限于框架中存在的算法

MD5 是否足够小(16 字节)?

更少的 CPU 消耗和占用空间通常是相互排斥的。

http://en.wikipedia.org/wiki/Time-space_tradeoff

【讨论】:

  • 它很小,但 CPU 使用率不是那么高效,我宁愿使用 MD4(作为一种非大脑)或 CRC32 之类的东西。
  • 没错。我很困惑,因为它通常显示为 32 位十六进制数字。
  • AFAIK MD4 或 CRC32 均未在 BCL 中实现。如果不想自己滚动或使用第 3 方,只需支付 15% 的税以方便 MD5
【解决方案2】:

FNV hash 是一种著名的快速散列算法。它不是加密安全的,但听起来您不需要安全哈希。

【讨论】:

【解决方案3】:

Paul Hsieh 有一个体面、简单、快速的 32 位 SuperFastHash,其性能优于大多数现有哈希函数,更易于理解/实现,并且听起来符合您的标准。

【讨论】:

  • 我自己将它用于哈希映射,在我的情况下它工作得很好(很少发生冲突)。
  • 是的,我听说这家伙是个天才什么的。他的哈希函数太棒了! :)
  • @paul:不,他不是天才,只是非常擅长自我营销:)
【解决方案4】:
【解决方案5】:

如果冲突不是什么大问题,您可以取每个文档的第一个字母。或者您可以使用文本的长度或带有文本的字符串。

【讨论】:

  • 或第一个(几个)字符和长度的组合。当然,您可以使用整个字符串作为散列。 =]
  • 这听起来很合理。
【解决方案6】:

哈希需要保存多长时间? GetHashCode() 很容易访问,给出了一个小的响应(4 个字节),这应该没问题(重新最小化冲突)超过 20 个字符串。

但是,GetHashCode() 不应该被持久化到数据库中——不过,它可以用于内存中的比较。请注意,算法可能会在框架之间发生变化(并且在 1.1 和 2.0 之间发生了变化)。

这样做的另一个优点是使用起来微不足道 - 只需使用 Dictionary<string,Something>,它将为您处理所有散列等。

【讨论】:

  • 如果我使用字典 我假设它会将整个字符串存储在内存中。
  • 是的,但是如果您不进行实际的相等性检查,散列总是有发生冲突的风险。
【解决方案7】:

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

【讨论】:

    【解决方案8】:

    我对自己有同样的要求,我实现了 xxHashSharp 。只要确保你使用了合适的库(x32 vs x64)。它在 c# 之外也可用here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 2015-10-27
      • 2019-02-27
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 2016-02-22
      • 2014-06-18
      相关资源
      最近更新 更多