ファイルAにバイトがあるとしましょう:
2
5
8
0
33
90
1
3
200
201
23
12
55
そして、最後の3つの連続したバイトの合計を格納する単純なハッシュアルゴリズムがあるので、次のようになります。
2
5
8 - = 8+5+2 = 15
0
33
90 - = 90+33+0 = 123
1
3
200 - = 204
201
23
12 - = 236
したがって、ファイルAを次のように表すことができます。15, 123, 204, 236
そのファイルを新しいコンピューターBにコピーし、いくつかの小さな変更を加えたとしましょう。ファイルBのバイトは次のとおりです。
255
2
5
8
0
33
90
1
3
200
201
23
12
255
255
「違いは、ファイルの先頭に1バイト追加され、最後に2バイト追加されることですが、残りは非常に似ていることに注意してください。」
そのため、同じアルゴリズムを実行して、ファイルの一部が同じであるかどうかを判断できます。ファイルAがハッシュコードで表されていたことを思い出してください。15, 123, 204, 236
ファイルBがそれらのハッシュコードのいくつかを私に与えるかどうか見てみましょう!
したがって、ファイルBIは、連続する3バイトごとに実行する必要があります。
int[] sums; // array where we will hold the sum of the last bytes
255 sums[0] = 255
2 sums[1] = 2+ sums[0] = 257
5 sums[2] = 5+ sums[1] = 262
8 sums[3] = 8+ sums[2] = 270 hash = sums[3]-sums[0] = 15 --> MATHES FILE A!
0 sums[4] = 0+ sums[3] = 270 hash = sums[4]-sums[1] = 13
33 sums[5] = 33+ sums[4] = 303 hash = sums[5]-sums[2] = 41
90 sums[6] = 90+ sums[5] = 393 hash = sums[6]-sums[3] = 123 --> MATHES FILE A!
1 sums[7] = 1+ sums[6] = 394 hash = sums[7]-sums[4] = 124
3 sums[8] = 3+ sums[7] = 397 hash = sums[8]-sums[5] = 94
200 sums[9] = 200+ sums[8] = 597 hash = sums[9]-sums[6] = 204 --> MATHES FILE A!
201 sums[10] = 201+ sums[9] = 798 hash = sums[10]-sums[7] = 404
23 sums[11] = 23+ sums[10] = 821 hash = sums[11]-sums[8] = 424
12 sums[12] = 12+ sums[11] = 833 hash = sums[12]-sums[9] = 236 --> MATHES FILE A!
55 sums[13] = 55+ sums[12] = 888 hash = sums[13]-sums[10] = 90
255 sums[14] = 255+ sums[13] = 1143 hash = sums[14]-sums[11] = 322
255 sums[15] = 255+ sums[14] = 1398 hash = sums[15]-sums[12] = 565
そのテーブルを見ると、ハッシュコードが一致しているため、ファイルBにはファイルAのバイトと追加のバイトが含まれていることがわかります。
このアルゴリズムを示す理由は、それがn次であったためです。言い換えると、最後の3つの連続するバイトのハッシュを、それらを反復処理することなく計算できたからです。
最後の3バイトのmd5を実行するなど、より複雑なアルゴリズムを使用する場合は、n ^ 3の順序になります。これは、ファイルを反復処理するときに、BIにハッシュを計算する内部forループが必要になるためです。最後の3バイト。
だから私の質問は:
アルゴリズムをn次に保つように改善するにはどうすればよいですか。これは、ハッシュを1回だけ計算することです。md5などの既存のハッシュアルゴリズムを使用する場合、アルゴリズムの順序を大幅に増やす内部ループをアルゴリズム内に配置する必要があります。
足し算の代わりに掛け算でも同じことができることに注意してください。しかし、カウンターは非常に速く成長します。多分私は乗算と加算と減算を組み合わせることができます...
編集
また、私がグーグルで検索した場合:
再帰的ハッシュ関数(グラム単位)
たくさんの情報が出てきて、それらのアルゴリズムを理解するのは非常に難しいと思います...
プロジェクトにこのアルゴリズムを実装する必要があるので、車輪の再発明を行っています...そこにはたくさんのアルゴリズムがあることを知っています。
また、私が考えていた別の解決策は、同じアルゴリズムに加えて強力な別のアルゴリズムを実行することでした。したがって、ファイルAIは、3バイトごとに同じアルゴリズムを実行し、さらに3バイトごとにmd5を実行します。2番目のファイルでは、最初のアルゴリズムが実現した場合に2番目のアルゴリズムを実行します。