0

person クラスが与えられた場合:

class person
{
    public string name;
    public int age;
}

たとえば、クラス person の GetHashCode メソッドをオーバーライドします。

 public override int GetHashCode()
 {
     unchecked
     {
          hashCode = 17;
          // ...some code here...
     }
     return hashCode;
 }

msdn の指示に基づいて、Equality もオーバーライドする必要があるため、次のようにしました。

public override bool Equals(object obj)
{
    // ...something like: 
    return this.name == (person)obj.name && this.age ==(person)obj.age;
}

ねえ、待って、sine 私は person インスタンスのハッシュコードを取得できます。Equals でハッシュコードを使用しないのはなぜですか? お気に入り:

public override bool Equals(object obj)
{
    return this.GetHashCode() == (person)obj.GetHashCode();
}

私はググって、ほとんどの Equals() の例が以前の Equals() の版と似ていることを発見しました。

どんな助けでも感謝します、thx。

4

4 に答える 4

3

2 つの等しくないオブジェクトのハッシュコードが等しくないとは限りません(これは衝突と呼ばれます) 。MSDNは次のように述べています。

2 つのオブジェクトを比較して等しい場合、各オブジェクトの GetHashCode メソッドは同じ値を返す必要があります。ただし、2 つのオブジェクトが等しくない場合、2 つのオブジェクトの GetHashCode メソッドは異なる値を返す必要はありません。

于 2013-06-09T09:48:31.570 に答える
1

ハッシュコードよりも多くの可能性があるからです。

たとえば、あなたのクラスを見てみましょう。

年齢層が と同じ範囲であるため、すでに問題がありますint。もちろん、これをなくすこともできますbyte。代わりに a を使用してください。それでも、文字列という問題があります。.NET 文字列は Unicode (UTF-16) であるため、文字ごとに 65,536 文字を使用できます。その後、急速にエスカレートします... 2 文字の文字列は最大 65,536 ^ 2 文字、つまり 4,294,967,296 ( uint.MaxValue) の可能性があります。それはたくさんありますが、それはたった2文字です.

td;lr : 等しくない 2 つのオブジェクトが同じハッシュコードを持たないことを保証することはできません。まったく。(それが abyteまたは ashortまたは asbyteまたは aでない限り、それushortは技術的なことです)

于 2013-06-09T09:51:55.940 に答える
0

背後にある考え方GetHashCodeは、2 つのオブジェクトが異なるハッシュ コードを持っていることを知っている場合、それらを見なくても、それらが等しくないと安全に想定できるということです。2 つのオブジェクトのハッシュ コードが一致する場合にのみ、それらをさらに調べる必要があります。オブジェクトのコレクションがあり、そのハッシュ コードが特定のオブジェクトと一致しない可能性がある場合 (たとえば、コレクション内のすべてのオブジェクトが 4591 で終わるハッシュ コードを持ち、特定のオブジェクトのハッシュ コードが 2011 で終わるため)、いずれのオブジェクトも調べる必要はありません。コレクション内のオブジェクトのいずれも、指定されたオブジェクトと一致しない可能性があることを認識します。

ハッシュ コードが特定のオブジェクトのハッシュ コードと一致するオブジェクトを検出する適切に作成されたコードは、オブジェクトが一致する可能性が高いかどうかを判断し、オブジェクトを詳細にスキャンして、実際に一致するかどうかを確認する必要があります。ハッシュ コードが一致してもオブジェクトが一致しない場合、ハッシュ コードの一致による唯一の結果は、オブジェクトが異なることを発見するのに必要な時間が増加することです。100 万分の 1 の比較で誤った一致が生成される場合、ハッシュ コードを事前にチェックすることで、詳細な比較の数を 100 万分の 1 に減らすことができます。対照的に、ハッシュ関数がそれほど優れておらず、1,000 回に 1 回の比較で誤った一致が得られる場合、ハッシュ コードを事前にチェックしても、詳細な比較の数が 1,000 分の 1 に "だけ" 減少します。もちろん、

于 2013-06-10T21:39:45.317 に答える