JavaScript for Files中的快速低冲突非加密哈希

时间:2013-04-25 22:13:30

标签: javascript html5 hash fileapi

我正在寻找在JavaScript中实现低冲突的快速哈希。它不需要是加密哈希。我基本上使用它来查看某个文件是否已经上传(或部分上传)到用户的帐户,以便在大型(视频)文件上保存一些上传时间。

我正在使用新的HTML5文件API来读取文件的切片。然后我把它移到SparkMD5给我一个文件的哈希。我喜欢SparkMD5允许我进行增量散列的事实,所以我不必在内存中读取整个内容。

总的来说,SparkMD5可以满足我的需求,但是对于大文件来说,我需要一段时间来获取我的哈希值(300MB文件大约需要30秒)。我希望减少这一点。我对哈希函数并不了解,所以我不想寻找一些已经实现的库。

1 个答案:

答案 0 :(得分:1)

benchmarked各种哈希算法,这是我找到的最快的选项:

  • 如果您只需要32位摘要,请使用iMurmurHash。请注意,这将在大约2 ** 14(16,000)个哈希值后发生碰撞。

  • 如果您需要超过32位,请使用SparkMD5。我没有找到快速的64或128位Murmur实现,但SparkMD5的速度非常快(75 MB /秒)。

    • 如果您需要增量更新,请考虑将字符串连接到更大的块,然后再将它们提供给SparkMD5,因为SparkMD5的增量散列似乎会受到一些适度的开销。

这些建议适用于纯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算法的内置加密模块。

      • 我还建议您尝试将字符串连接到更大的块中,因为在将字符串传递给加密模块时,字符串会隐式转换为缓冲区,并且每个缓冲区创建都非常慢。性能通常会受到缓冲区创建和字符串连接的瓶颈,因为本机哈希函数的速度非常快。