5

重複の可能性:
hashCode は何に使用されますか? ユニークですか?

私は多くの文字列を生成しています。私の質問は次のとおりです。

C# で 2 つの異なる文字列が同じハッシュ コードを持つことはできますか?

ハッシュコードとは、次のことを意味します。

string s = "Hello";
s.GetHashCode();

私の質問は、C# が文字列を生成するために従うアルゴリズムに関するものです。他のすべてのハッシュ コードが既に生成されているか、生成されていない場合に衝突が発生する可能性があります。誰かがこの答えを持っている可能性があります。

4

4 に答える 4

21

はい。ハッシュ コードは一意ではありません。2^32 (4,294,967,296) の可能なハッシュ コードがあります (32 ビット整数の整数値ごとに 1 つ)。可能な文字列は事実上無数にあります。無限の数の文字列のそれぞれが異なる数の有限数を持つことは明らかに不可能です。

同じハッシュ コードを持つ 2 つの異なる文字列 (または任意の値) は、「衝突」と呼ばれます。優れたハッシュ アルゴリズムは、衝突を可能な限り最小限に抑えようとします (ただし、衝突をなくすことはできません)。多くの場合、これは実際のデータの実際のタイプに依存します。この文字列の場合、これは、類似した、または類似したサイズの文字列が (理想的には) 衝突しにくいことを意味します。

文字列のハッシュコードを文字列の一意の識別子として使用することを検討しているため、質問していると思います。 そうしないでください

興味がある場合は、一般的なハッシュ コードについて詳しく説明しているリンクを次に示します。

于 2012-10-26T19:14:50.690 に答える
6

一般に、ハッシュ空間のサイズの平方根と同じ数の要素があれば、ハッシュの衝突を予期する必要がありますhttp://en.wikipedia.org/wiki/Birthday_problem

32 ビット ハッシュの場合、最初の衝突は 65k 要素付近で発生するはずです。これはもちろん統計的なものなので、いつ起こるかを正確に予測することはできませんが、直感には役立ちます。文字列が 10 個ある場合は、おそらく衝突を心配する必要はありません。

于 2012-10-26T19:14:59.067 に答える
1

ハッシュ関数と、使用しているアルゴリズムによって異なります。

一般に、1 つの入力 (ハッシュしたい値) を 1 つの出力 (ハッシュされた値) にマッピングできるハッシュ手法もあれば、2 つの異なる入力を同じ出力にマッピングするハッシュ手法もあります。後者は Collision http://en と呼ばれます。 wikipedia.org/wiki/Collision_(コンピュータ科学)

たとえば、ハッシュ関数が 100 人のユーザーの名前を 0 ~ 9 の数字にコード化すると、多くの衝突が発生します。

戻るGetHashCode();

MSDN の次の 2 つの記事を参照してください。

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

これは機能を説明しています。これはその下からの引用です。最初の箇条書きを確認してください。

GetHashCode は、ハッシュ テーブルのバランスを取るという 1 つのことだけを行うように設計されています。それ以外には使用しないでください。特に:

  • オブジェクトの一意のキーは提供しません。衝突の可能性が非常に高いです。
  • 暗号強度がないため、デジタル署名の一部として、または同等のパスワードとして使用しないでください。
  • チェックサムに必要なエラー検出プロパティを必ずしも備えているわけではありません。

ここにもっと説明があります:

http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx

于 2012-10-26T19:33:37.113 に答える
0

簡単な答えは「はい」です。ハッシュ コードを使用すると、常に衝突の可能性があります。

于 2012-10-26T19:14:38.257 に答える