0

そのため、カスタム Equals() 関数を持つオブジェクトであるキーを持つ辞書を作成する必要があります。GetHashCode() もオーバーライドする必要があることを発見しました。最適なパフォーマンスを得るには、衝突しないハッシュ コードを使用する必要があると聞きましたが、それは直感に反するように思えます。私はそれを誤解しているかもしれませんが、ハッシュコードを使用することの全体的なポイントは、アイテムをバケットにグループ化することであり、ハッシュコードが決して衝突しない場合、各バケットには目的を無効にするように見えるアイテムが 1 つしかないようです。

では、意図的にハッシュ コードを時々衝突させるべきでしょうか? パフォーマンスは重要です。これは、おそらく数百万のアイテムに成長する辞書になり、非常に頻繁に検索を行うことになります。

4

3 に答える 3

2

ハッシュ コードの目的は、配列へのインデックスを提供することです。各配列は、0 個、1 個、または複数のアイテムを含むバケットです。ルックアップのパフォーマンスは、バケット内の要素の数に依存します。バケットに入ると、O(n) 検索になるため (n はバケット内の要素の数)、少ないほど良いです。したがって、ハッシュコードが衝突を可能な限り防ぎ、最適な O(1) 時間を可能な限り確保することが理想的です。

于 2013-09-29T00:33:01.870 に答える
1

辞書はデータをバケットに保存しますが、ハッシュコードごとに 1 つのバケットはありません。バケットの数は容量に基づいています。値は、ハッシュコードのモジュラスとバケット数に基づいてバケットに入れられます。

GetHashCode()5 つのオブジェクトに対してこれらのハッシュ コードを生成するメソッドがあるとします。

925
10641
14316
17213
28624

ハッシュコードは分散する必要があります。それで、これらは広がって見えますよね?7 つのバケットがある場合、最終的にそれぞれのモジュラスを計算すると、次のようになります。

1
1
1
0
1

したがって、最終的にバケットになります。

0 - 1 item
1 - 4 items
2 - 0 items
3 - 0 items
4 - 0 items
5 - 0 items
6 - 0 items

おっと、今はあまり広がっていません。

これは作成されたデータではありません。これらは実際のハッシュ コードです。

含まれているデータからハッシュ コードを生成する方法のサンプルを次に示します (上記のハッシュ コードに使用される式ではなく、より適切な式です)。

https://stackoverflow.com/a/263416/118703

于 2013-09-29T00:42:29.070 に答える