ハッシュ関数は通常、すべての結果バケットにデータを均等に分散するように記述されています。
ファイルが利用可能なサイズの固定範囲に均等に分散されていると仮定した場合、ファイルには1024(2 ^ 10)の均等に分散された個別のサイズしかないとします。せいぜいファイルサイズを保存することは、異なるファイルサイズの数だけ衝突の可能性を減らすだけです。
注:2 ^ 32の均等に分散された個別のサイズであると想定できますが、それでも残りの計算は変更されません。
MD5での衝突の一般的な確率は(たとえば)であると一般に認められています1/(2^128)
。
特にハッシュ関数に組み込まれているものがない限り、そうではありません。X
の確率が任意の2つのランダムな値{ 、}P(MD5(X) == MD5(X+1))
と同じままであるような有効なものが与えられます。つまり、、、およびの任意の値に対して==です。Y
Z
P(MD5(Y) == MD5(Z))
P(MD5(X) == MD5(X+1))
1/(2^128)
X
Y
Z
これを2^10の個別のファイルと組み合わせると、ファイルサイズを保存することで、アイテムが異なるかどうかを示す最大10ビットが追加されます(これも、ファイルがすべての値に均等に分散されていることを前提としています)。
したがって、最善の場合は、Nバイト未満の一意の値に対してさらにNバイトのストレージを追加するだけです(Nを超えることはできません)。したがって、ファイルサイズを保存するよりも、ハッシュ値のデータが均等に分散される可能性が高いため、代わりにSHA-1/2などを使用してハッシュ関数から返されるバイト数を増やすことをお勧めします。
つまり、MD5が衝突に十分でない場合は、より強力なハッシュを使用します。より強力なハッシュが遅すぎる場合は、MD5などの衝突の可能性が低い高速ハッシュを使用してから、SHA-1などの低速ハッシュを使用します。またはSHA256を使用して衝突の可能性を減らしますが、SHA256が十分に高速で、スペースの2倍が問題にならない場合は、おそらくSHA256を使用する必要があります。