最初のコメントの後、その背後にある数学について考え始めました。これが私が思いついたものです。私は専門家ではないので、お気軽に訂正してください。注:これはすべて、ハッシュ関数が均一に分散されていることを前提としています。
基本的に、チェックサムのビット数が多いほど、衝突の可能性が低くなります。ファイル数が多いほど高くなります。
まず、1 組のファイルが XOR された場合に衝突が発生する可能性を見つけてみましょう。最初は小さい数値で作業するので、チェックサムが 4 ビット (0 ~ 15) であると仮定し、それを と呼びますn
。
2 つの合計で、合計ビット数2n
(8) であるため、2^(2n)
合計 (256) の可能性があります。ただし、衝突だけに関心があります。XOR を衝突させるには、両方の合計で同じビットを反転する必要があります。ビット2^n
を使用しているため、これを行う方法は (16)しかありません。n
したがって、衝突の全体的な確率16/256
は(2^n) / (2^(2n))
、または単純に1/(n^2)
です。つまり、衝突しない確率は です1 - (1/(n^2))
。したがって、このサンプルの場合、これは安全である、つまり 93.75% でn
あることを意味します。15/16
もちろん、チェックサムが大きいほど良いです。ちっぽけな の場合でも、n=16
99.998% を取得します
もちろん、それは単一の比較のためです。それらをすべて一緒にローリングしているので、f-1
比較を行っていf
ます。ファイルの数はどこですか。この方法で衝突の確率を合計するにf-1
は、最初のステップで得た確率を乗じます。
したがって、4 ビットのチェックサムを持つ 10 個のファイルの場合、かなりひどい結果が得られます。
(15/16) ^ 9 =衝突しない確率 55.92%
ファイルの数を増やしても、ビットを追加すると、これは急速に改善されます。
8 ビットのチェックサムを持つ 10 個のファイルの場合:
(255/256) ^ 9 = 96.54%
16 ビットの 100/1000 ファイルの場合:
(65536/65536) ^ 99 = 99.85%
(65536/65536) ^ 999 = 98.49%
ご覧のとおり、まだ小さいチェックサムで作業しています。>= 32ビットのものを使用している場合、計算をしようとすると、計算機で浮動小数点の丸めエラーが発生します。
TL、DR:
はチェックサムn
ビットf
の数で、 は各セット内のファイルの数です。
nonCollisionChance = ( ((2^n)-1) / (2^n) ) ^ (f-1)
collisionChance = 1 - ( ((2^n)-1) / (2^n) ) ^ (f-1)
一連のチェックサムを XOR する方法は、おそらく問題ありません。