Javascript 快速(XOR-?)组合SHA1散列以生成新的散列

Javascript 快速(XOR-?)组合SHA1散列以生成新的散列,javascript,hash,sha1,Javascript,Hash,Sha1,拥有一个唯一的文本行(字符串化JSON数据)列表(可能很大),我需要为整个文本文档计算一个唯一的哈希。通常会在文档中添加新行,偶尔会从文档中删除一些行,从而生成文档的全新哈希 最终目标是仅使用散列就能识别相同的文档。 当然,每次修改后计算整个文档的SHA1散列会得到所需的唯一散列,但计算成本也会很高,尤其是在一个5兆字节的文档中只追加了约40个字节,所有这些数据都必须再次经过SHA1计算的情况下 因此,我正在寻找一种解决方案,它允许我减少计算新哈希所需的时间 问题属性/要求的摘要: 每一行都保

拥有一个唯一的文本行(字符串化JSON数据)列表(可能很大),我需要为整个文本文档计算一个唯一的哈希。通常会在文档中添加新行,偶尔会从文档中删除一些行,从而生成文档的全新哈希

最终目标是仅使用散列就能识别相同的文档。

当然,每次修改后计算整个文档的SHA1散列会得到所需的唯一散列,但计算成本也会很高,尤其是在一个5兆字节的文档中只追加了约40个字节,所有这些数据都必须再次经过SHA1计算的情况下

因此,我正在寻找一种解决方案,它允许我减少计算新哈希所需的时间

问题属性/要求的摘要:

  • 每一行都保证是唯一的
  • 行的顺序不一定重要(如果不重要则更好)
  • 单行的长度通常很小,但整个文档可能很大
  • 该算法可以针对附加数据进行优化(即,在这种情况下,删除数据甚至可能需要从头开始)
我目前的想法是分别计算每一行的SHA1(或任何内容)散列,然后将散列一起异或。这应该满足所有要求。对于新行,我只计算该行的SHA1,然后用已知的和对其进行XOR

然而,我很怀疑,因为

  • 我不确定XORed散列是否仍然足够强大,能够准确地识别文档(即,是否存在明显更高的意外冲突概率?)
  • 计算大量短线的SHA1散列本身可能在计算上很昂贵(至少在初始化期间)
有人能解释这些问题吗


或者,使用SHA1(或类似的散列)是否通常可以快速生成附加数据的新散列(
旧散列
+
附加数据
=
新散列
)?

您可以对类似的流计算执行增量更新:

var crypto = require('crypto');

var shasum = crypto.createHash('sha1');
shasum.update("Hello, ");
shasum.update("World!");
console.log(shasum.digest('hex'));

shasum = crypto.createHash('sha1');
shasum.update("Hello, World!")
console.log(shasum.digest('hex'));

单独对每个文件进行散列时会出现问题

如果添加两个相同的行,则组合的异或将不会更改

您最好对所有单独的行散列进行散列


也许可以使用一个。

您使用的是什么
sha1
js实现?这个实现对于这个问题不重要,因为它甚至不需要是sha1,只要散列足够强,可以“唯一地”标识文档。不过,为了回答你的问题,我通常使用lib。很高兴知道,谢谢!也许您也能告诉我一些关于上述XOR方法的事情吗?您的
XOR
方法有问题
a xor b xor b==a
。我还认为,你永远不会得到等于sha1('abcd')==foo(sha1('abc'),'d')。这看起来几乎是不可能的。请注意,“a或b或a”永远不会发生,因为所有的行都是唯一的。我打算提出这一点。我不认为浏览器WebCryptoAPI提供了这种灵活性(Safari也不支持这种灵活性),但任何SHA-1 Merkle-Damgard结构的实现都应该很容易修改为可流化,增量执行此操作的效率收益应该超过升级JavaScript加密所带来的轻微低效。关于这种方法的安全性,您最好在Crypto.SE上提问,但据我所知,对于大多数实际威胁,这应该是安全的(假设是唯一的行)。添加两条相同的行是不可能的(它们是唯一的,请参见问题)。感谢Merkle Tree的提示,看起来很有趣-虽然我发现散列大量短线非常昂贵,所以可能流式sha1散列(另一个答案)在我现有的计算机上可能更好,SHA256将每秒散列400 MB…和移动电话?;)iphone6s:400MB/s,iPhone4s(4岁):40MB/swithjavascript?什么实施?