低冲突非加密哈希函数

Tim*_*dge 3 language-agnostic algorithm hash

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

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

因此,这里使用的是一种好的算法,我正在使用C#,但是我确定大多数算法都可以在任何平台上使用。就像我说的那样,我正在使用SHA-256,但是我敢肯定还有更好的选择。

Lio*_*gan 5

Yann Collet的xxHash可能是一个不错的选择(主页GitHub

xxHash是一种非常快速的非加密哈希算法,其工作速度接近RAM限制。提出了32位和64位两种样式。

至少有4个C#实现(请参见首页)。

过去,我取得了出色的成绩。

哈希大小为32或64位,但是XXH3正在生成:

XXH3具有512位的较宽内部状态,这使其适合生成高达256位的哈希。目前,仅公开64位和128位变体,但是如果有一天需要,可以对256位变体使用类似的配方。所有变体都具有相同的速度,因为只有完成阶段不同。

通常,哈希值越长,其计算速度就越慢。64位哈希足以满足大多数实际用途。

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