2009-09-03 9 views

答えて

22

ハッシュコードは同一性についてではなく、ほぼ同等です。実際には、あなたは彼らがおよそ非平等だと言うことができる:2つのオブジェクトは異なるハッシュコードをお持ちの場合は

  • 2つのオブジェクトが同じハッシュコードを持っている場合は、それら
  • 等しくすることができる、彼らは」 再ない等しい

ハッシュコード固有のものではない、また彼らは(2つのオブジェクトが同じハッシュを持っているが、まだ等しくない場合もある)平等を保証します。

その用途については:彼らはほとんど常に迅速実際通常のキー/値のマップでは平等、(例えばDictionary<TKey, TValue>)またはセット(例えばHashSet<T>)のために、テストにおそらく同じオブジェクトを選択するために使用しています。

+0

具体的な説明Jon。 – user160677

+0

HashCodeはシステムによって生成されますか?乱数のようにランダムな値を返しますか? – user160677

+3

デフォルトの 'GetHashCode'実装は、ランタイムによって使用される何らかの種類の内部オブジェクト識別子を返します。しかし 'GetHashCode'は仮想なので、あなたが気に入ったものを返すようにオーバーライドすることができます。あなたがそれを上書きする必要があるときにこれらの2つの質問を確認してください:http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode and http:// stackoverflow .com/questions/873654/overriding-gethashcode-for-mutable-objects-c –

5

いいえ、HashCodeは一意ではありません。しかし、すでにオブジェクトへの参照があり、object.ReferenceEquals()を使用して身元を追跡するのに最適です。

+1

+1あなたの言葉が少し不明な場合でも、あなたのポイントはまだそこにあります。 – ChaosPandion

+1

'=='はオーバーロードすることができるので、参照の等価性をテストする正しい方法は 'object.ReferenceEquals()'メソッドです。 –

+0

ありがとうMartinho Fernandesが具体的に – user160677

1

値自体は、ハッシュテーブルなどのハッシュアルゴリズムで使用されます。デフォルトの実装では

、GetHasCodeは.NETオブジェクトをそのまま使用してはならないために、あなたに

クラスを所有するため、オブジェクトの一意性を保証するものではありません、一般的に作成するために、GetHashCodeメソッドをオーバーライドすることをお勧めですあなたのオブジェクトの一意の値。

1

ハッシュを必要とするアルゴリズム\データ構造(ハッシュテーブルなど)に使用されます。同じハッシュを持つ2つのオブジェクトが必ずしも等しいわけではないので、ハッシュコードはオブジェクトアイデンティティを追跡するために単独で使用することはできません。しかし、2つの等しいオブジェクトが同じハッシュコードを持つ必要があります(C#は、他のオブジェクトを上書きせずにオーバーライドすると警告を出します)。

関連する問題