3

Microsoft のドキュメントで次のことがわかりました。

Two objects that are equal return hash codes that are equal. However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash code

メソッドを理解するために独自のテストを作成しました。

public static void HashMetod() 
{
    List<Cliente> listClientTest = new List<Cliente>
    {
        new Cliente { ID = 1, name = "Marcos", Phones = "2222"}
    };

    List<Empresa> CompanyList = new List<Empresa>
    {
        new Empresa { ID = 1, name = "NovaQuimica", Clients = listClientTest },
        new Empresa { ID = 1, name = "NovaQuimica", Clients = listClientTest }
    };

    CompanyList.Add(CompanyList[0]);

    foreach (var item in CompanyList)
    {
        Console.WriteLine("Hash code = {0}", item.GetHashCode());
    }

    Console.WriteLine("CompanyList[0].Equals(CompanyList[1]) = {0}", CompanyList[0].Equals(CompanyList[1]));
    Console.WriteLine("CompanyList[0].Equals(CompanyList[2]) = {0}", CompanyList[0].Equals(CompanyList[2]));
}

私の質問は: 2 つの Differents オブジェクトが同じ HashCode を返すにはどうすればよいですか? 2 つのオブジェクトが同じものを返した場合、それらは Equals であると信じています (これが私のメソッドが示していることです)。私の方法を実行して、これをチェックしてください。

4

6 に答える 6

9

鳩の巣の原理に基づく簡単な観察:

  1. GetHashCodeint- 32 ビット整数を返します。
  2. 4.294.967.296 の 32 ビット整数があります。
  3. 大文字の英字だけを考えると、141.167.095.653.376 の 10 文字の単語があります。大文字と小文字を含めると、144.555.105.949.057.024 通りの組み合わせになります。
  4. 使用可能なハッシュ コードよりも多くのオブジェクトがあるため、一部の (異なる) オブジェクトは同じハッシュ コードを持つ必要があります。

もう 1 つのより現実的な例は、地球上の各人にハッシュコードを与えたい場合、32 ビット整数よりも多くの人がいるために衝突が発生することです。

「楽しい」事実:誕生日のパラドックスにより、人口 100.000 人の都市では、50% 以上の確率でハッシュ衝突が発生します。

于 2013-08-16T13:09:35.543 に答える
4

これが例です。

String s1 = new String("AMY");
String s2 = new String("MAY");

2 つの異なる Objectですが、hashCode がたとえば文字の ASCII コードで計算される場合、MAY と AMY で同じになります。

このためのハッシュの概念を基本的に理解する必要があります。

hashing an object means "finding a value (number) that can be reproduced by the very same instance again and again".

Object.hashCode() のハッシュ コードはint 型であるため、 2^32 個の異なる値しか持てません。そのため、ハッシュ アルゴリズムによっては、2 つの異なるオブジェクトが同じ hashCode を生成するときに、いわゆる「衝突」が発生します。

それらをよりよく理解するために、一連の良い例を見ることができます。

  1. PigeonHole、靴下のピッキング、ヘアカウント
  2. ソフトボール部
  3. 誕生日問題

お役に立てれば。

于 2013-08-16T13:04:28.117 に答える
1

それを確実に理解するには、おそらくハッシュ関数全般を読む必要があります。ウィキペディアから:

ハッシュ関数は主に、元のデータへの短縮された参照として機能する固定長の出力データを生成するために使用されます。

したがって、基本的には、大きな (潜在的に無限の) 可能性のセットを取り、それらをより小さく、より管理しやすい可能性のセットに合わせようとしていることを知っています。セットのサイズが 2 つ異なるため、2 つの異なるソース オブジェクトとそれらのハッシュの間で衝突が発生することが保証されます。とはいえ、優れたハッシュ関数は、これらの衝突を可能な限り最小限に抑えます。

于 2013-08-16T13:08:56.873 に答える
0

ハッシュ コードの目的は、オブジェクトを受け取ったコードが、オブジェクトと等しい可能性がないものをすばやく識別できるようにすることです。多くのオブジェクトを格納するように求められたコレクション クラスが、等しいかどうかをテストする方法以外は何も知らない場合、別のオブジェクトが与えられ、格納されているオブジェクトのいずれかと一致するかどうかを尋ねられた場合、コレクションは呼び出す必要があります。Equalsコレクション内のすべてのオブジェクト。一方、コレクションがGetHashCode探しているアイテムだけでなく、コレクションに追加された各アイテムを呼び出すことができ、コレクション内のオブジェクトの 99% が のハッシュコードと一致しないハッシュコードを報告した場合、探しているアイテムの場合、ハッシュコードが一致するオブジェクトの 1% のみを調べる必要があります。

2 つのアイテムのハッシュ コードが一致するという事実は、ハッシュ コードをチェックしない場合よりも速く 2 つのアイテムを比較するのに役立ちませんが、アイテムのハッシュ コードが一致しないという事実は、それらをさらに調べる必要をなくします。 . アイテムが一致する可能性よりも一致しない可能性がはるかに高いシナリオでは、ハッシュ コードを使用すると、一致しないケースを、場合によっては桁違いに高速化できます。

于 2013-08-16T20:44:54.213 に答える