12

いくつかのデータ オブジェクトの 32 ビット ハッシュを作成しようとしています。私は独自のハッシュ関数を書く気がなく、md5 が利用可能であるため、現在のアプローチは md5 ハッシュの最初の 32 ビット (つまり最初の 16 進数の 8 桁) を使用することです。これは受け入れられますか?

つまり、md5 ハッシュの最初の 32 ビットは、他の部分文字列と同じように「ランダム」ですか? それとも、たとえば最後の 32 ビットを好む理由はありますか? それとも、4 つの 32 ビット部分文字列を XOR して一緒にするのでしょうか?

いくつかの先制的な説明:

  • これらのハッシュは、暗号的に安全である必要はありません。
  • 私は md5 のパフォーマンスには関心がありません。それは、私のニーズに対して十分に高速です。
  • これらのハッシュは、衝突がほとんど起こらないように十分に「ランダム」である必要があります。
  • このシステムでは、アイテムの数が 10,000 を超えないようにする必要があります (現実的には、おそらくその半分にはならないでしょう)。したがって、最悪の場合、衝突に遭遇する確率は約 1% になります (十分に「ランダムな」ハッシュが見つかったと仮定します)。
4

3 に答える 3

11

適切なハッシュ関数の場合、個々のビットはほぼランダムである必要があります。したがって、MD5 ハッシュの最初の 32 ビットのみを使用しても安全です。

または、計算がはるかに高速なCRC32を使用することもできます(コードは約20行です)。

于 2009-05-13T21:03:44.840 に答える
9

つまり、md5 ハッシュの最初の 32 ビットは、他の部分文字列と同じように「ランダム」ですか?

はい。答えが「いいえ」の場合、MD5 は十分に安全ではありません。(確かに、いくつかのマイナーな暗号化の弱点がありますが、統計的な弱点は認識していません)

于 2009-05-13T21:03:43.127 に答える
0

ここでの古い質問ですが、頻繁に出てきます。答えは間違いなく NO です。それ以外の場合、MD5 文字列は 32 ビットを超える長さである必要はありません。

それにもかかわらず、MD5 文字列はまったくランダムではありません。同じ入力が与えられた場合、完全かつ一貫して再現可能です (これはほぼ反ランダムです ;-))。

それがあなたの目的にとって十分にユニークであるかどうかは、あなたの目的に依存します。

于 2011-04-14T19:02:20.657 に答える