2009-05-13 9 views
11

私はいくつかのデータオブジェクトの32ビットのハッシュを作成しようとしています。私自身のハッシュ関数を書くのは気にならず、md5が利用可能であるので、私の現在の方法は、md5ハッシュから最初の32ビット(すなわち最初の8桁の16進数)を使うことです。これは受け入れられますか?md5ハッシュの最初の32ビットは他の部分文字列と同じように「ランダム」であるか?

つまり、他の部分文字列と同様に、md5ハッシュの最初の32ビットは「ランダム」と同じですか?また、最後の32ビットを好む理由がありますか?あるいは、おそらく4つの32ビット部分文字列をXORしますか?

いくつかの先制明確化:

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

すでにMD5ハッシュが計算されていますか? (Subversionチェックインのメタデータの一部など)、またはMD5ハッシュを自分で計算する必要がありますか?後者の場合、@Johannesのコメントに同意すると、CRC32はもっと簡単になります。 –

+1

どうやら先制的に "あなたの質問はこのようにしなければならないので無効です"とコメントしています。 – Kip

+0

申し訳ありませんが、私はMD5ハッシュを使用していません。 CRC32がより簡単であることを意味します。あなたまたはあなたの顧客だけがあなたの要件を満たすアルゴリズムを判断することができます。 –

答えて

10

良いハッシュ関数については、個々のビットはほぼランダムでなければなりません。したがって、MD5ハッシュの最初の32ビットだけを使用することは安全です。

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

+0

"私はmd5のパフォーマンスには関心がありません - それは私のニーズに十分に速いです。" – Kip

+3

キップ:パフォーマンスかどうか、CRC32は32ビットのハッシュ値を返します。これはまさにあなたが望むものです。 – dwc

9

、ちょうど任意 他のサブストリングとして「ランダム」としてMD5ハッシュの最初の32ビット ですか?

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

+0

多くの攻撃が表示されているので、MD5は十分に安全です:) – Joey

+4

この文は、資格が追加された場合にのみ真です。すべての衝突攻撃を実行不可能にするには十分に安全ではありません。それは、(今のところ)十分な安全性があり、プリイメージ攻撃を実行不可能にしています。 http://www.vpnc.org/hash.html –

+0

も参照してください。私の投稿はMD5が十分に安全だとは言いませんでした。 :-) –

1

ここに古い質問がよく出ます。答えはもっともですが、そうでなければMD5文字列は32ビットを超える必要はありません。

MD5文字列はランダムではありません。同じ入力であれば完全に一貫して再現できます(これはかなり反復的です;-))。

あなたの目的に十分にユニークであるかどうかは、目的によって異なります。

関連する問題