【问题标题】:Very low collision non-cryptographic hashing function非常低的冲突非加密散列函数
【发布时间】:2019-12-18 16:39:32
【问题描述】:

我正在编写一个使用散列来加速文件比较的应用程序。基本上我预先散列文件 A,然后应用程序运行并将文件夹中的文件与以前散列的文件相匹配。我目前寻找哈希函数的标准如下:

  • 磁盘 IO 是限制因素应该足够快。我目前正在使用 SHA-256,它工作得很好,但太重了,使我的应用程序 CPU 受限。
  • 在这种情况下,密码学/安全性无关紧要,用户正在输入这两个文件,因此如果他们故意制造哈希冲突,那就在他们身上。
  • 应该不惜一切代价避免哈希冲突。我可以根据大小和它们的散列比较文件,但如果两者都匹配,则假定文件是相等的。我知道由于数据压缩,任何散列都无法保证这一点,但是具有与 SHA-256 相同的唯一性保证的东西会很好。
  • 文件大小从 10 字节到 2GB 不等
  • 流式算法会很好,因为我试图保持应用程序的内存使用率较低,换句话说,我不想将整个文件加载到内存中以对其进行哈希处理。
  • 哈希大小无关紧要,如果我用 1024 位哈希得到以上所有内容,我完全可以接受。

那么在这里使用什么好的算法,我使用的是 C#,但我确信大多数算法都可以在任何平台上使用。就像我说的,我使用的是 SHA-256,但我确信有更好的东西。

【问题讨论】:

标签: algorithm hash language-agnostic


【解决方案1】:

Yann Collet 的 xxHash 可能是个不错的选择(Home page, GitHub

xxHash 是一种速度极快的非加密哈希算法,工作 速度接近 RAM 限制。它有两种口味,32 和 64 位。

至少有 4 个 C# 实现可用(参见主页)。

过去我用它取得了很好的成绩。

哈希大小是 32 位或 64 位,但 XXH3 正在制作中:

XXH3 具有 512 位的宽内部状态,这使得它 适合生成高达 256 位的哈希。暂时只有 公开了 64 位和 128 位变体,但可以使用类似的配方 如果有一天有需要,用于 256 位变体。全部 变体具有相同的速度,因为只有最终阶段是 不同。

一般来说,哈希值越长,它的计算就越慢。 64 位哈希对于大多数实际用途来说已经足够了。

您可以通过组合两个散列函数(例如 128 位 XXH3 和 128 位 MurmurHash3)来生成更长的散列。

【讨论】:

  • 看起来像个赢家
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多