7

2つの異なる文字列が与えられた場合、それは常に当てはまりs.GetHashCode() != s1.GetHashCode()ますか?

個別の整数の数が個別の文字列の数より少ない場合はありますか?

4

3 に答える 3

15

いいえ。単純な思考実験と同じように、文字列はいくつありますか(ヒント:2 32を超える数、したがって一意のハッシュコードはいくつありますか(ヒント:232問題を参照してください) 。

ハッシュコードは、両方のオブジェクトが等しいことを返す場合は常に等しい必要があります。Equalsさらに、2つのハッシュコードが等しくない場合は常に、オブジェクト自体を等しくすることはできません。これ以上の要件はありませんが、ハッシュテーブルが適切に機能するように、適切に分散する必要があります。つまり、基本的には次のとおりです。

ここに画像の説明を入力してください

それぞれの⇐バリアントの省略に注意してください。これは同等ではなく、2つの意味があります。

ドキュメントを引用するには:

ハッシュ関数には、次のプロパティが必要です。

  1. 2つのオブジェクトが等しいと比較される場合、各オブジェクトのGetHashCodeメソッドは同じ値を返す必要があります。ただし、2つのオブジェクトが同等であると比較されない場合、2つのオブジェクトのGetHashCodeメソッドは異なる値を返す必要はありません。

  2. オブジェクトのGetHashCodeメソッドは、オブジェクトのEqualsメソッドの戻り値を決定するオブジェクトの状態に変更がない限り、一貫して同じハッシュコードを返す必要があります。これはアプリケーションの現在の実行にのみ当てはまり、アプリケーションを再度実行すると別のハッシュコードが返される可能性があることに注意してください。

  3. 最高のパフォーマンスを得るには、ハッシュ関数がすべての入力に対してランダムな分布を生成する必要があります。

于 2012-07-23T06:05:51.737 に答える
7

@Joeyのステートメントに追加するには、にハッシュコードを常に等しくすることはできません。

2 ^ 32の可能なハッシュコードがありますが、入力文字列は無限です。

ハッシュ衝突は、十分な(2 ^ 32 + 1)入力値で発生することが保証されています。

実際、誕生日の問題が原因で、ハッシュの衝突は想像以上に一般的です。64ビットのハッシュコード(32ビットのハッシュコードよりもはるかに多くのハッシュ値があり、単純に考えられる2倍ではない)を使用するシステムでしばらく前に計算を行ったとき、1億の入力値がありました。少なくとも1つのハッシュ衝突が発生する可能性があります。確率は1%くらいだったと思います。

于 2012-07-23T06:06:49.307 に答える
1

私が知っている限りObject.GetHashCode()、オブジェクトに対してハッシュ関数を提供していません(したがって、この場合、Joeyの考慮は正しくないと思います)。オブジェクトが作成され、オブジェクトが解放されたときに、CLRによってオブジェクトに割り当てられた一意のインデックスのみを返します。ガベージコレクション。

そのため、特定の瞬間に(同じAppDomain内で)ハッシュコードを複製することはできませんが、時間の経過とともに重複する可能性があります(アプリケーションの実行中に同じインデックスが複数回割り当てられる場合があります)。

この質問についてもここで説明します: Object.GetHashCode()のデフォルトの実装

于 2014-09-07T08:19:25.343 に答える