非常低的冲突非加密散列函数
Very low collision non-cryptographic hashing function
我正在编写一个使用散列来加速文件比较的应用程序。基本上,我预先对文件 A 进行哈希处理,然后该应用程序运行并将文件夹中的文件与之前经过哈希处理的文件进行匹配。我目前寻找哈希函数的标准如下:
- 应该足够快,磁盘IO是限制因素。我目前正在使用 SHA-256,它工作得很好,但太重了,使我的应用程序 CPU 受限。
- Cryptography/security 在这种情况下无关紧要,用户正在输入两个文件,因此如果他们故意制造哈希冲突,那是他们的责任。
- 应该不惜一切代价避免哈希冲突。我可以根据大小和哈希值比较文件,但如果两者都匹配,则文件被认为是相等的。我知道由于数据的压缩,不可能用任何散列来保证这一点,但是具有与 SHA-256 相同类型的唯一性保证的东西会很好。
- 文件大小从 10 字节到 2GB 不等
- 流式算法会很好,因为我试图将应用程序的内存使用率保持在较低水平,换句话说,我不想将整个文件加载到内存中以对其进行哈希处理。
- 哈希大小无关紧要,如果我用 1024 位哈希得到以上所有内容,我完全可以接受。
那么在这里使用什么算法比较好,我使用的是 C#,但我确信大多数算法都可以在任何平台上使用。就像我说的,我正在使用 SHA-256,但我确信有更好的东西。
Yann Collet 的 xxHash 可能是一个不错的选择(Home page, GitHub)
xxHash is an extremely fast non-cryptographic hash algorithm, working
at speeds close to RAM limits. It is proposed in two flavors, 32 and
64 bits.
至少有 4 个 C# impelmentations 可用(参见主页)。
我过去用它取得了很好的成绩。
哈希大小为 32 位或 64 位,但 XXH3 正在制作中:
XXH3 features a wide internal state of 512 bits, which makes it
suitable to generate a hash of up to 256 bit. For the time being, only
64-bit and 128-bit variants are exposed, but a similar recipe can be
used for a 256-bit variant if there is any need for it one day. All
variant feature same speed, since only the finalization stage is
different.
一般而言,散列越长,其计算速度越慢。 64 位哈希对于大多数实际用途来说已经足够了。
您可以通过组合两个哈希函数(例如 128 位 XXH3 和 128 位 MurmurHash3)来生成更长的哈希值。
我正在编写一个使用散列来加速文件比较的应用程序。基本上,我预先对文件 A 进行哈希处理,然后该应用程序运行并将文件夹中的文件与之前经过哈希处理的文件进行匹配。我目前寻找哈希函数的标准如下:
- 应该足够快,磁盘IO是限制因素。我目前正在使用 SHA-256,它工作得很好,但太重了,使我的应用程序 CPU 受限。
- Cryptography/security 在这种情况下无关紧要,用户正在输入两个文件,因此如果他们故意制造哈希冲突,那是他们的责任。
- 应该不惜一切代价避免哈希冲突。我可以根据大小和哈希值比较文件,但如果两者都匹配,则文件被认为是相等的。我知道由于数据的压缩,不可能用任何散列来保证这一点,但是具有与 SHA-256 相同类型的唯一性保证的东西会很好。
- 文件大小从 10 字节到 2GB 不等
- 流式算法会很好,因为我试图将应用程序的内存使用率保持在较低水平,换句话说,我不想将整个文件加载到内存中以对其进行哈希处理。
- 哈希大小无关紧要,如果我用 1024 位哈希得到以上所有内容,我完全可以接受。
那么在这里使用什么算法比较好,我使用的是 C#,但我确信大多数算法都可以在任何平台上使用。就像我说的,我正在使用 SHA-256,但我确信有更好的东西。
Yann Collet 的 xxHash 可能是一个不错的选择(Home page, GitHub)
xxHash is an extremely fast non-cryptographic hash algorithm, working at speeds close to RAM limits. It is proposed in two flavors, 32 and 64 bits.
至少有 4 个 C# impelmentations 可用(参见主页)。
我过去用它取得了很好的成绩。
哈希大小为 32 位或 64 位,但 XXH3 正在制作中:
XXH3 features a wide internal state of 512 bits, which makes it suitable to generate a hash of up to 256 bit. For the time being, only 64-bit and 128-bit variants are exposed, but a similar recipe can be used for a 256-bit variant if there is any need for it one day. All variant feature same speed, since only the finalization stage is different.
一般而言,散列越长,其计算速度越慢。 64 位哈希对于大多数实际用途来说已经足够了。
您可以通过组合两个哈希函数(例如 128 位 XXH3 和 128 位 MurmurHash3)来生成更长的哈希值。