我正在使用新的HTML5文件API来读取文件的片段,然后将其交给SparkMD5来生成文件的哈希值。SparkMD5允许我进行增量哈希计算,这样我就不必在内存中读取整个文件。
总的来说,SparkMD5对我的需求来说还可以,但对于大型文件,生成哈希值可能需要一些时间(对于300MB文件,需要约30秒)。我理想情况下想减少这个过程的时间。我对哈希函数并不十分了解,因此不打算自行开发,而是希望能够找到一个已经实现好的库来使用。
更新(2021年8月): 我的基准测试早于WebAssembly,因此已经过时了。可能存在编译到 WebAssembly 中的哈希函数,它们比纯 JS 实现更快。如果有人想要更新此基准测试,欢迎在我的基准测试存储库中提交请求!
我对各种哈希算法进行了基准测试,并找到了最快的选项:
如果您仅需要 32 位摘要,请使用iMurmurHash。请注意,这将在大约 2 ** 14(16,000)次哈希后产生冲突。
如果您需要超过 32 位,请使用SparkMD5。我没有找到快速的 64 或 128 位 Murmur 实现,但是 SparkMD5 的速度非常快(75 MB / 秒)。
这些建议适用于纯 JavaScript。我使用字符串对它们进行了基准测试,但 SparkMD5 也可以使用 ArrayBuffers。
如果您希望在 Node 上获得快速的哈希模块,最好的选择略有不同:
如果您正在对缓冲区进行哈希处理:请使用内置的crypto模块和 MD5 算法。
唯一的例外是: 如果您不需要增量哈希,并且需要超过500 MB /秒的吞吐量,且可以使用本地的npm依赖项,则可以使用murmurhash-native来获得额外的性能。我没有测试少于128位的摘要大小,因为即使使用128位哈希,速度也如此之快,不太可能成为瓶颈。
(请注意,尽管murmurhash-native技术上支持增量哈希,但在此模式下它比Node内置的MD5算法慢。)
如果您正在对单个字符串进行哈希处理而非增量哈希,请将其转换为缓冲区并查看前面的项目。
如果您正在进行增量哈希处理:
如果只需要32位,请使用iMurmurHash。请注意,这将在约2 ** 14(16,000)个哈希后产生碰撞。
如果需要更多位:请使用内置的crypto模块和MD5算法。