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

Udo*_*o G 5 javascript hash sha1

有一个(可能很大的)唯一文本行(字符串化的JSON数据)列表,我需要为整个文本文档计算一个唯一哈希。通常,新行会附加到文档中,偶尔还会从其中删除一些行,从而导致文档出现全新的哈希。

最终目标是仅使用哈希即可识别相同的文档。

当然,在每次修改后为整个文档计算SHA1哈希将为我提供所需的唯一哈希,但在计算上也将非常昂贵 -特别是在仅将约40个字节附加到5兆字节的文档中并且所有数据将必须再次进行SHA1计算。

因此,我正在寻找一种解决方案,可以减少计算新哈希的时间。

问题属性/要求摘要:

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

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

但是,我对此表示怀疑,因为...

  • 我不确定XORed哈希是否仍然足够强大,可以准确地标识文档(即,是否存在明显更高的不必要冲突可能性?)
  • 计算很多短线的SHA1散列本身可能会很昂贵(至少在初始化期间)

任何人都可以阐明这些问题吗?

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

vp_*_*rth 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'));
Run Code Online (Sandbox Code Playgroud)