快速(XOR-?)组合SHA1哈希以生成新哈希

时间:2016-06-24 14:47:11

标签: javascript hash sha1

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

最终目标是能够使用哈希识别相同的文档。

当然,在每次修改后计算整个文档的SHA1哈希值会给我所需的唯一哈希值,但也会计算成本高昂 - 特别是在只附加约40个字节的情况下到5兆字节的文档,所有数据都必须再次通过SHA1计算。

所以,我正在研究一种解决方案,它可以减少计算新哈希所需的时间。

问题属性/要求的摘要:

  • 每一行都保证是唯一的
  • 线条的顺序不一定需要重要(如果没有,则更好)
  • 单行的长度通常很小,但整个文档可能很大
  • 该算法可针对附加的数据进行优化(即删除数据甚至可能需要在这种情况下从头开始重启)

我目前的想法是分别计算每一行的SHA1(或其他)哈希值,然后将哈希值一起计算。这应该满足所有要求。对于新行,我只计算该行的SHA1,并将其与已知总和进行异或。

然而,我怀疑是因为......

  • 我不确定XORed哈希是否仍然足够强大以准确识别文档(即,是否存在明显更高的不必要冲突概率?)
  • 计算许多短线的SHA1哈希值可能在计算上非常昂贵(至少在初始化期间)

任何人都能对这些问题有所了解吗?

或者,通常可能使用SHA1(或类似的哈希)快速生成附加数据的新哈希(old hash + appended data = new hash)?

2 个答案:

答案 0 :(得分:2)

单独散列每个文件存在问题。

如果添加两条相同的行,则组合的xor不会改变。

最好散列所有单独的线条哈希值。

也许使用Merkle Tree

答案 1 :(得分:0)

您可以对喜欢流计算执行增量更新:

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'));