11

HashSet<T>.Addまず、の結果を比較しますGetHashCode。それらが等しい場合は、を呼び出しますEquals

さて、私の理解は、実装するために、オブジェクトのフィールドで何かをしなければならないということGetHashCodeです簡単な実装例は、オーバーライドされたSystem.Object.GetHashCodeに最適なアルゴリズムは何ですか?にあります。

ランダムデータで満たされた1.000.000ペアのオブジェクトの両方を比較する私のテストでは、パフォーマンスは2つの間でほぼ同等です。GetHashCodeリンクされた例のように実装され、すべてのフィールドEqualsを呼び出すだけです。Equalsでは、なぜ使いすぎGetHashCodeたのEqualsでしょうか。

4

5 に答える 5

20

一部のタイプでは、Equalsテストは比較的費用がかかる場合があります。通常、クラスのすべてのフィールドを比較する必要があります。つまり、クラスのサイズに応じて線形の時間がかかります。クラスが大きいほど、平等を比較するのに費用がかかります。

では、あるオブジェクトを他の1000個のオブジェクトと比較する必要がある場合はどうなりますか?Equals1000回呼び出すと、費用がかかる場合があります。Nがクラスのサイズである場合、N*2000フィールドアクセスを実行する必要があります

GetHashCode代わりに、クラスの内容に基づいて「ほとんど一意の」整数を生成します。つまり、クラスフィールドは一度アクセスされます。そして、それができたら、この整数を他のオブジェクトのハッシュコードを構成する1000個の整数と比較できます。

このような単純なユースケースでも、N*1000フィールドアクセスのみが必要になります。

しかし、ハッシュコードを保存するとどうなるでしょうか。オブジェクトをハッシュセットに挿入すると、そのハッシュコードが1回計算されます。これで、ハッシュセットでルックアップを実行するときはいつでも、 1つのハッシュコード(外部オブジェクトのハッシュコード)を計算するだけで、単純な整数を比較するだけで済みます。したがって、Nクラスのフィールドアクセス(ハッシュコードを計算する必要がある新しいオブジェクトの場合)に加えて、アルゴリズムによって異なりますが、1)比較的少なく、2)安価な整数比較の数があります。

于 2011-06-10T11:12:19.523 に答える
8

アルゴリズムが1つのオブジェクトがすでに1.000.000オブジェクトのセットにあるかどうかをテストする場合、Equals1.000.000回呼び出す必要がありますが、1回だけ呼び出す必要があります(同じハッシュを持っていても異なるオブジェクトを削除するためにGetHashCode()数回呼び出す必要があります)Equalsコード)。

于 2011-06-10T10:58:06.330 に答える
2

GetHashCodeを使用すると、物事をバケットに入れることができます。複数のオブジェクトが同じハッシュコードを持つことができます。次に、Equalsを使用してバケット内の一致を検索します。これにより、大規模なコレクションの内容をすばやく見つけることができます

于 2011-06-10T10:57:55.860 に答える
1

GetHashCode()ハッシュテーブルに使用できる整数値を取得します。そのハッシュコードは、ハッシュテーブルが非常に高性能である理由の1つです。ただし、同じハッシュコードを持つオブジェクトが複数存在する可能性があります。それがと呼ばれる理由Equals()です。オブジェクトが等しくない場合、それらは同じバケットに入れることができます。等しい場合、オブジェクトはすでにハッシュテーブルにあり、追加する必要はありません。

于 2011-06-10T10:57:46.857 に答える
1

の本質的な側面はGetHashCode、2つのオブジェクトのハッシュコードが異なるという観察は、オブジェクトが異なるという観察だけでなく、はるかに強力な何かの観察を構成するということです。1つのセット内のすべてのアイテムのハッシュコードに、それらに欠けているプロパティがある場合別のオブジェクトのすべてのオブジェクトの場合、セットには共通のアイテムがありません。

たとえば、偶数を返すすべてのオブジェクトを1つのセットに入れ、奇数GetHashCodeを返すすべてのオブジェクトを別のセットに入れると、検索するオブジェクトが与えられます。呼び出すと、すべてのオブジェクトを即座に考慮から除外できます。セットの1つにあるオブジェクト。2セットを使用する代わりに、1つが20を使用した場合、1つは19セットからすべてを削除することができます。256セットの場合、255を削除できます。多くの場合、アイテムの数に基づいてセットの数を調整すると、少数のオブジェクトを除いて、オブジェクトを見なくてもすべて削除できますGetHashCodeGetHashCode

2つのオブジェクトのハッシュコードを調べて、それらが等しいかどうかを確認することは、単にオブジェクトが等しいかどうかを直接チェックするよりも速くなることはめったにありません。一方、あるオブジェクトが999,990の他のオブジェクトと等しくないことを、それらを見ずに知ることができると、同等性の比較がどれほど速くても、見るよりもはるかに速くなる傾向があります。

于 2013-12-18T05:09:46.380 に答える