質問

重複の可能性:
オーバーライドされた 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 をまったくオーバーライドしない方が良いです...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top