我正在寻找在JavaScript中实现低冲突的快速哈希。它不需要是加密哈希。我基本上使用它来查看某个文件是否已经上传(或部分上传)到用户的帐户,以便在大型(视频)文件上保存一些上传时间。
我正在使用新的HTML5文件API来读取文件的切片。然后我把它移到SparkMD5给我一个文件的哈希。我喜欢SparkMD5允许我进行增量散列的事实,所以我不必在内存中读取整个内容。
总的来说,SparkMD5可以满足我的需求,但是对于大文件来说,我需要一段时间来获取我的哈希值(300MB文件大约需要30秒)。我希望减少这一点。我对哈希函数并不了解,所以我不想寻找一些已经实现的库。
答案 0 :(得分:1)
我benchmarked各种哈希算法,这是我找到的最快的选项:
如果您只需要32位摘要,请使用iMurmurHash。请注意,这将在大约2 ** 14(16,000)个哈希值后发生碰撞。
如果您需要超过32位,请使用SparkMD5。我没有找到快速的64或128位Murmur实现,但SparkMD5的速度非常快(75 MB /秒)。
这些建议适用于纯JavaScript。我用字符串对它们进行了基准测试,但SparkMD5也采用了ArrayBuffers。
如果您想在Node上使用快速哈希模块,那么您的最佳选择会略有不同:
如果您正在散列缓冲区:使用内置的crypto模块和MD5算法。
例外情况是:如果您不需要增量散列,和,则需要超过500 MB /秒的吞吐量,和 #39;对于本机npm依赖项,请使用murmurhash-native获得一些额外的性能。我没有测试小于128位的摘要大小,因为即使使用128位,散列也是如此之快,以至于它不太可能成为瓶颈。
(请注意,murmurhash-native在技术上支持增量散列,但在此模式下它比Node的内置MD5算法慢。)
如果要以非增量方式对单个字符串进行哈希处理,请进行转换 它到缓冲区并查看前面的要点。
如果要逐步散列字符串:
如果您只需要32位,请使用iMurmurHash。请注意,这将在大约2 ** 14(16,000)个哈希值后发生碰撞。
如果需要超过32位:使用带有MD5算法的内置加密模块。