快速低碰撞的非加密散列的JavaScript文件(Fast low-collision non-cr

2019-09-01 03:52发布

我在寻找一个JavaScript实现低碰撞快散。 它并不需要是一个加密哈希值。 我基本上使用它作为一个方法,如果给定的文件已被上传(或部分上传)到用户的帐户,将它们保存在大(视频)文件上传一些时间。

我现在用新的HTML5文件API中的文件切片阅读。 然后我手这一关,以SparkMD5给我的文件的哈希值。 我喜欢这样的事实SparkMD5允许我做一个增量散列,所以我不必读取内存中的整个事情。

总体而言,SparkMD5适合我的需要,但对于大文件可能需要一段时间才能得到我,我的哈希值(一个300MB的文件约30秒)。 我会非常想减少这种。 我不是散列函数,所以我不希望端口的东西,知识渊博,我非常想找一个已经实施库。

Answer 1:

我为基准各种散列算法,这里是我发现最快的选项:

  • 如果你只需要32个比特概要,使用iMurmurHash 。 请注意,这会给你以后约2 ** 14(16,000)哈希冲突。

  • 使用SparkMD5如果你需要超过32位。 我没有找到一个快64或128位的杂音的实现,但是SparkMD5是令人惊讶的快速(75 MB /秒)。

    • 如果您需要增量更新,可以考虑加入串入更大的块他们喂养SparkMD5之前,作为SparkMD5的增量散列似乎来自一些温和的开销受到影响。

这些建议是纯JavaScript。 我基准他们字符串,但SparkMD5需要ArrayBuffers为好。


如果你想在节点快速散列模块,你最好的选择是稍有不同:

  • 如果你是散列缓冲液:使用内置的加密与MD5算法模块。

    • 唯一的例外是:如果你不需要增量散列你需要超过500 MB /秒的吞吐量, 并且你确定与本地NPM的依赖,用murmur哈希本地一些额外的性能。 我没有测试消化小于128位的大小,因为即使有128位散列是如此之快,它不太可能成为瓶颈。

      (请注意,murmur哈希本土技术上支持增量散列,但它比节点内建的MD5算法在此模式下慢。)

  • 如果您哈希一个字符串非增量,将其转换为一个缓冲区,看到前面的子弹点。

  • 如果你是增量散列字符串:

    • 如果你只需要32位,使用iMurmurHash。 请注意,这会给你以后约2 ** 14(16,000)哈希冲突。

    • 如果你需要超过32位:使用内置有MD5算法加密模块。

      • 我也建议您尝试使用将字符串连接在一起形成大的块,因为字符串隐式转换,当你把它们传递到加密模块缓冲区,并且每个缓冲区创作是相当缓慢。 性能通常由缓冲区的创建和连接字符串来瓶颈,为本地哈希函数是非常快的比较。


文章来源: Fast low-collision non-crypto hash in JavaScript for Files