2012-10-31 12 views

答えて

16

誰かがハッシュコードを使ってどのようなことを行うことができますか?

と等しいオブジェクトをすぐに見つけてください。

特に、このメソッドは、Dictionary<TKey, TValue>(キー用)とHashSet<T>などのタイプで通常使用されます。

あなたはでなければなりません。は、同じハッシュコードを持つオブジェクトが等しいと仮定します。詳細についてはEric Lippert's blog post、ハッシュコードの使用についてのより一般的な説明はWikipedia hash tableページを参照してください。

+0

キーを知るために私たちを助け? equalsメソッドでキーが違うとは考えられないのですか? (IEquatable)? –

+0

@RoyiNamir:はい、しかし、最初は*ハッシュコードと比較されています。これにより安価に*可能性のあるマッチを得ることができるからです。それ以外の場合は、辞書からフェッチするたびにすべてのキーと等しいかどうかを確認する必要があります。 –

+0

equalsが仮定を破棄できる場合、コンパイラは潜在的なマッチングを行うのがなぜ迷惑でしょうか? (私はoverriding getHashCodeをオーバーライドする必要があることを知っています) - しかし、別の質問です。 –

2

ハッシュコードは、等価性テスト中にオブジェクト を識別するために使用される数値です。コレクション内のオブジェクト のインデックスとしても機能します。

GetHashCodeメソッドは、ハッシュアルゴリズムや、ハッシュテーブルなどのデータ構造体 での使用に適しています。

GetHashCodeメソッドのデフォルト実装では、 は異なるオブジェクトの一意の戻り値を保証しません。さらに、 .NET Frameworkは、 GetHashCodeメソッドの既定の実装を保証しません。返される値は、 異なる.NET Frameworkのバージョン間で同じになります。したがって、このメソッドのデフォルトの の実装は、ハッシュの目的で固有のオブジェクト の識別子として使用してはなりません。

GetHashCodeメソッドは、派生型によってオーバーライドできます。値 は、この型に適切な のハッシュ関数を提供し、 ハッシュテーブルで有用な分布を提供するために、このメソッドをオーバーライドする必要があります。一意性のために、ハッシュコードは、静的フィールドまたは プロパティではなく、インスタンスフィールドまたはプロパティの値 に基づいている必要があります。

Hashtableオブジェクトのキーとして使用されるオブジェクトは、コードを生成する必要があるため、 GetHashCodeメソッドもオーバーライドする必要があります。キーとして使用されるオブジェクトが有用な のGetHashCodeの実装を提供しない場合、Hashtableオブジェクトの構築時に、 というハッシュコードプロバイダを指定できます。 .NET Framework バージョン2.0より前のバージョンでは、ハッシュコードプロバイダは System.Collections.IHashCodeProviderインターフェイスに基づいていました。 バージョン2.0以降、ハッシュコードプロバイダは System.Collections.IEqualityComparerインターフェイスに基づいています。

- Sourced from MSDN

0

基本的な考え方は、2つのオブジェクトが異なるハッシュコードを持っている場合は、それらが異なるということです。それらが同じハッシュコードを持っていれば、それらは異なっていても同等であってもよい。

オブジェクトがコレクション内に存在するかどうかを確認するには、最初にハッシュコードをチェックします。これは、整数を比較してから、同じハッシュコードを持つオブジェクトに対してのみ、より正確なテストを行います。

たとえば、これはコレクションクラスで使用されます。

0

GetHashCodeメソッド

GetHashCodeのみこれらの2つのタイプ

の利益のために存在する - >ハッシュテーブル

- >GenericDictionary

GetHashCodeメソッドは、あなたに良いhashtableパフォーマンスのための多様なキーを与えます。

は型がコンパイル時に不明であるnull-safe等価比較を提供等しい等しいです。 の署名は

public static bool Equals(object A,object B)です。

タイプは、コンパイルtime.Youでは不明であるのであれば、あなたが==または!=のような演算子を使用傾ける例えば、一般的なタイプに

を書くときに、その便利Equals

を使用する必要があります。

class Test<T> 
{ 
    T value; 
    public void SetV(T newValue) 
    { 
    if(object.Equals(newValue,value)) 
    //We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time 
    } 
} 

ToString

タイプインスタンスのデフォルトtexual representationを返します.hi sの方法は、すべてのタイプの

を建てメソッドGetType

によって

GetTypeを無効にされruntime.Itで評価されるタイプのnameassembybase type ..and他人

関連する問題