2009-03-19 6 views

答えて

8

最も目に見える形でマッピング構造のためです。

辞書またはハッシュテーブルのキーとして使用する場合、これを行い、任意のクラスは、予期しない動作を持つことになります。理由ビーイングは、実装が両方のGetHashCodeメソッドを使用し、適切にテーブル内の値を見つけるために等しいことです。アルゴリズムの短いバージョンは、次の

  1. は、バケットの数でハッシュコードのモジュラスを取り、それはバケットインデックス
  2. コール.Equals(だ)指定されたキーと特定のバケット内のすべてのキーのためであります。
  3. 値、不一致= NO値で一致がある場合。

GetHashCodeメソッドを維持するために失敗し、完全にこのアルゴリズムを破るだろう同期(およびその他多数)に等しいです。

+0

ご清聴ありがとうございます。 –

+0

実装は、使用するバケットの数をどのように決定しますか?これは固定値ですか? –

7

ジャレッドパーソンズブログは平等とGetHashCodeメソッドは非常に重要である理由を実装するの良い説明があります。

Properly Implementing Equality

+6

あなた自身のブログへのリンクをupvoteすることは恥知らずですか? – JaredPar

0

あなたがGetHashCodeをオーバーライドしない場合は、あなたのオブジェクトを比較して何が、それは間違っているかもしれません。

それは2つのインスタンスが等しい場合GetHashCodeが同じ値を返さなければならないことが実証されているように、それは同じであってもよいグループオブジェクトへの最初のパスとしてGetHashCode使用する平等のためにそれらをテストすることを望む任意のコードの特権であります(異なるハッシュコードを持つオブジェクトは等しいとは限りません)。あなたのGetHashCode方法は同じオブジェクトに異なる値を返す場合、彼らは最初のパスで異なるグループに入ることがあり、そのEquals方法を使用して比較されることはありません。

これは、任意のコレクション型データ構造に影響を与える可能性があるが、このような辞書、ハッシュセットとしてハッシュコードベースのものに特に問題となるであろう。

要約:Equalsをオーバーライドするときは、常にGetHashCodeを上書きし、その実装が一貫していることを確認してください。

0

それはハッシュキーの意図した動作に依存していると仮定すると、キーが動作するように失敗します使用するすべてのアルゴリズム。 Equalある

2つのオブジェクトがリモートでデフォルトの実装によって保証されていない、同じハッシュキーの値を、持っている必要があります。番バケットのコレクションとしてハッシュ/辞書構造の

1

と思います。あなたは常に自分GetHashCodeメソッド()に対応するバケツにものを入れる場合は、あなただけの何かがあるかどうかを確認する(equalsを使って())1つのバケットを検索する必要があります。あなたが正しいバケツを見ているなら、これは機能します。

だから、ルールは次のとおりです。等号())は、2つのオブジェクトが等しい(あると言うならば、彼らは)(同じGetHashCodeメソッドを持っている必要があります。

+0

番号付きのバケットを考えるのではなく、比較を避けるためにハッシュコードを使用する方が簡単だと思います。オブジェクトXのハッシュコードがどのような手段であっても、オブジェクトYのハッシュコードと一致しないことが分かっている場合、それらの何かを比較する必要はありません。バケットは、ハッシュコードが特定の値と等しくないアイテムをコードが無視する簡単な方法を提供しますが、多くのコレクションは同じバケットにソートされたアイテムであってもハッシュコードを明示的に比較します。 – supercat

関連する問題