C# GetHashCode() 高性能ハッシュ アルゴリズム [重複]
-
11-12-2019 - |
質問
重複の可能性:
オーバーライドされた System.Object.GetHashCode に最適なアルゴリズムは何ですか?
これは、私たちが知っていることですが、 Equals
の方法 Object
カスタムタイプでは、オーバーライドして次の実装を提供する必要もあります。 GetHashCode
のサポートに使用する一意のハッシュ コードの生成をサポートするメソッド Hashtable
そして Dictionary
コレクション クラスであり、他のクラスである場合もあります。
これにより、内部で使用されるハッシュ アルゴリズムの実装が義務付けられます。 overriden
GetHashCode
この方法は最適かつ正確です。つまり、型の一意のハッシュを生成し、それを可能な限り迅速に実行して、型を使用するアプリケーションのパフォーマンスを向上させます。
私の質問は、 どのハッシュアルゴリズムか で使用すると正確で最適なパフォーマンスが得られます。 GetHashCode
実装?それとも、基本型のみを使用する必要がありますか? GetHashCode
実装?両方ともこの答えが知りたいです value types
そして reference types
..
編集:なぜオーバーライドする必要があるのかについて、以下のクラスの例を示します。 Equals
:
public class Laptop : LaptopBase
{
public readonly string Make;
public readonly string ProcessorArch;
public readonly int MemorySupported;
public readonly int HardDiskGBSupported;
public readonly Color ColorName;
public Laptop(make, procArch, memorySupp, hdGB, color)
{
Make = make;
ProcessorArch = procArch;
MemorySupported = memorySupp;
HardDiskGBSupported = hdGB;
ColorName = color;
}
}
ここで、上記で定義されたすべてのフィールドが互いに一致する 2 つの Laptop インスタンスに対して true を返したいので、 Equals
そして GetHashCode
メソッド、そしてもう 1 つの要件は、ご覧のとおり、これが派生クラスであり、さらに再利用でき、多数のメソッドをサポートすることです。したがって、値型 (構造体) にすることはできません。すべての一致するインスタンスフィールドを持つ上記のタイプの2つのインスタンスで試してみました。 Equals
- それは戻ります false
私がそうありたい場所 true
..
このようなシナリオをどのようにサポートすればよいでしょうか?
解決
これは実装される型によって異なりますが、値が適切に分散される必要があり、GetHashCode() が一意の値を返す必要はありません。これは Equals 実装で使用されるフィールドに基づく必要があり、それらのフィールドは不変である必要があります。したがって、Equals/GetHashCode の要件は構造体とクラスで同じです。
そして、Henk が言ったように、Equals/GetHashCode をまったくオーバーライドしない方が良いです...