2016-06-24 20 views
4

の文字列(文字列化されたJSONデータ)ユニークなハッシュを計算する必要があります。多くの場合、新しい行がドキュメントに追加され、時には一部の行が削除され、ドキュメントの完全に新しいハッシュになります。SHA1ハッシュを結合して新しいハッシュを生成する

究極の目的は、ハッシュを使用するだけで同一のドキュメントを識別できることです。もちろん

、各変更は私に希望のユニークなハッシュを与えるだろうが、また、計算上高価だろう後に文書全体のためのSHA1ハッシュを計算する - 特にちょうど〜40のバイトを5に追加されている状況で、すべてのデータがSHA1計算を再度実行する必要があります。

私は新しいハッシュを計算するのにかかる時間を短縮できる解決策を探しています。

問題の性質/要件の要約:

各ラインは
  • そうでない場合は、必ずしもさらに良い(問題には必要はありません行の順序一意であることが保証されて
    • 単一ラインの長さは通常小さいが、文書全体が(アルゴリズムは添付データのために最適化することができる
    • 大きいかもしれない、すなわちDELET INGのデータであっても

    私の現在の考え方は、個別に各1ライン分のSHA1(または任意)のハッシュを計算することで、その後XORハッシュ一緒に)このような場合には、ゼロからの再起動が必要な場合があります。それはすべての要件を満たす必要があります。新しいラインについては、私はちょうどそのラインのSHA1を計算し、それを既知の和とXORします。私は「XOR演算のハッシュは、まだ正確に文書(すなわちを識別するのに十分な強さかどう分からない

    • ...ので

      はしかし、私は疑問に思います。かなり高い可能性があります不必要な衝突?)

    • 短い線のSHA1ハッシュの多くを計算するには、少なくとも初期化時に(それ自身の計算コストが高いかもしれません)

    誰もがこれらの問題にいくつかの光を当てることができますか?

    また、SHA1(または同様のハッシュ)を使用して、追加データ(old hash + appended data = new hash)の新しいハッシュを迅速に生成することは可能でしょうか?

  • +0

    どのような 'sha1'js実装を使用していますか? –

    +0

    この問題は重要ではありません。なぜなら、ハッシュが文書を「一意に」識別するのに十分強い限り、SHA1である必要はないからです。しかし、あなたの質問に答えるために、私は通常[rusha](https://www.npmjs.com/package/rusha)のlibを使用しています。 –

    答えて

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

    おかげで、ありがとう!おそらく上記のXORのアプローチについて教えていただけますか? –

    +0

    あなたの 'xor'アプローチは何か間違っています。 'a xor b xor b == a'。私はまた、あなたは '' sha1( 'abcd')== foo(sha1( 'abc')、 'd') 'の平等を決して得られないと考えています。それは不可能に近いように見えます。 –

    +0

    すべての行が一意であるので、 'xor b xor a'は決して起こり得ないことに注意してください。 –

    2

    は、個々のファイルをハッシュに問題があります。

    2つの同一の行が追加された場合、結合されたxorは変更されません。

    個々のラインハッシュをすべてハッシュしない方がよい場合があります。

    おそらくMerkle Treeを使用します。

    +0

    2つの同一の行が追加されることはありません。 *一般的に*私は短い線のハッシングが非常に高価であることを知ったので、おそらくストリーミングsha1ハッシュ(他の答え)はおそらく最終的には良いでしょう –

    +1

    私はavaiable SHA256を持っているコンピュータで400 MB /秒をハッシュします。 – zaph

    +0

    ...携帯電話ですか? ;) –

    関連する問題