2012-05-22 6 views
5

GetHashCode()関数が何かを返すときに特別な意味を持っていますか?contains^symbolGetHashCode()with^

public class ClassProp 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public int Prop4 { get; set; } 
    public int Prop5 { get; set; } 

    public override int GetHashCode() 
    { 
     return Prop1.GetHashCode()^Prop2.GetHashCode()^
       Prop3.GetHashCode()^Prop4.GetHashCode()^Prop5.GetHashCode(); 
    } 
} 
+0

XOR演算子は指摘されていません。これはここで結合されたハッシュコードを作成するために使用されています。 SOのこの記事を見てください:http://stackoverflow.com/questions/1079192/is-it-possible-to-combine-hash-code-for-private-members-to-generate-a-new-ハッシュ –

答えて

4

これはちょうどbitwise xor operatorです。これは、異なるオブジェクトのハッシュコードを1つの全体的なハッシュコードに結合するためによく使用されます。

Googleで検索するのは簡単ではありません。そのようなことを探すときのヒントはtable of all operatorsです。

+0

実際のプロジェクトでGetHashCode()関数を使用するときを理解するための簡単な実際の例を共有できますか? – Nilish

+0

あなたは一般に 'GetHashCode'を自分で呼び出すことはありません。しかし、このフレームワークは、平等テスト、辞書ハッシュなどのためにこのフレームワークを使用しています。ほとんどの場合、デフォルトの実装に頼ることができます。 –

+0

あなたはこの 'public override bool Equals(Object obj) {}'について話していますか?もしそうなら、これら2つの間の関係は何ですか? – Nilish

4

^は、C#XOR operatorです。何も "特別な"ものではなく、すべてのクラスプロパティのハッシュコードが一緒にXORされるということだけです。

を編集します。GetHashCodeは、複雑なオブジェクトの略式識別子として使用される汎用コードを返します。一般的な使用方法は、オブジェクトを格納し、ハッシュコードに基づいてオブジェクトをすばやく取得する場合に、データ構造をハッシュすることです。クラスPerson対応するハッシュコードを持ついくつかのオブジェクトを仮定:

Alex 8540 
John 9435 
Peter 2453 

これらのコードは、いくつかまたは各オブジェクトのすべてのフィールドに基づいて生成され、効率的なハッシュを確保するため、めったにできるだけ衝突してはなりません。今、我々は、ハッシュコードを使用して、ハッシュテーブルにオブジェクトを格納することができる:

Entries 
0 -> Alex 
1 -> John 
2 -> Peter 

オブジェクトは、位置を決定するために、それぞれのハッシュコードを使用してテーブル内に格納されています。次に、同じハッシュコードを使用して簡単に検索できます。

私はあなたがSOの投稿で説明するにはあまりにも多すぎるので、ハッシュテーブルの仕組みに関するいくつかの文献を見つけることをお勧めします。

+0

実際のプロジェクトでGetHashCode()関数をいつ使用するのかを理解するための簡単な実際の例を共有できますか? – Nilish

+0

@Kanav:私の編集を参照してください。 – Tudor

+0

辞書に非常に基本的な記事(リンク)がありますか? – Nilish

0

^ C#でXOR演算子は、ここを参照してください場合:http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx

あなたのすべての例では、やっているが、それのプロパティからハッシュコードをXORです。

+0

実際のプロジェクトでGetHashCode()関数を使用するときを理解するための簡単な実際の例を共有できますか? – Nilish

0

次のようにビット単位のXOR演算の動作:

A = 10111 B = 01010

A^B = 11101

異なるcorrespodingビットが1でresutl、同様のものが0

もたらします

あなたの場合、これらの整数は最初にバイナリに変換され、上記の例のように処理されます。

2

これはbitwize XOR operatorです。

これは、GetHashCodeを実装する際に使用される非常に一般的な演算子です。

この場合、その実装は理想的ではない可能性があります。 XOR(単独)を使用する際の問題は、必ずしも衝突の可能性を減らすわけではないということです。問題は、クラスがそうのように定義されていることである。

class Foo 
{ 
    public int Bar { get; set; } 
    public int Baz { get; set; } 

    // ... 
    public override int GetHashCode() 
    { return this.Bar.GetHashCode()^this.Baz.GetHashCode(); } 
} 

は時にバー== 2とバー== 4とバズ== 2などのバズの== 4同じハッシュコードを作成する予定です。ユースケースによっては、ハッシュの衝突が増える可能性があります。そのため、GetHashCodeを実装する際に注意する必要があります。また、ハッシュコードの実装が等価チェックなどと一致するような変更可能な型を作成するときは、非常に注意する必要があります。

+1

実際のプロジェクトでGetHashCode()関数を使用するときを理解するためのシンプルな実例を共有できますか? – Nilish

関連する問題