3

Equals特定の理由で、公式の契約に従わない複数のクラスがあります。上書きGetHashCode()されたこれらのクラスは単純に 0 を返すため、ハッシュマップで使用できます。

これらのクラスのいくつかは同じインターフェースを実装しており、このインターフェースをキーとして使用するハッシュマップがあります。だから私は、すべてのクラスが少なくとも異なる(しかしそれでも一定の)値を返す必要があると考えましたGetHashCode().

問題は、この値をどのように選択するかです。最初のクラスが 1 を返し、次のクラスが 2 というように単純に返す必要がありますか? または、次のようなものを試す必要があります

class SomeClass : SomeInterface {
    public overwrite int GetHashCode() {
        return "SomeClass".GetHashCode();
    }
}

ハッシュはより均等に分散されますか?(返された値を自分でキャッシュする必要がありますか、それとも Microsoft のコンパイラでこれを最適化できますか?)

更新: Equals は規約に違反しているため、オブジェクトごとに個別のハッシュコードを返すことはできません。具体的には、この問題について言及しています。

4

4 に答える 4

2

GetHashCode()定数値をオーバーライドして返す理由がどうなるか興味があります。「契約」に違反し、関数をまったくオーバーライドせずGetHashCode()、デフォルトの実装をObject.

編集

あなたが行ったことは、参照ではなく内容に基づいてオブジェクトを一致させることができるということである場合、異なるクラスを使用することで提案することは、単に異なる定数を使用することで機能しますが、非常に非効率的です。あなたがしたいことは、クラスの内容を取得して、速度と均等な分散のバランスをとる値を生成できるハッシュ アルゴリズムを考え出すことです (ハッシュ 101 です)。

私はあなたが何を探しているのかわからないと思います...このパラダイムの定数を選択するための「良い」スキームはありません。一方が他方よりも優れているわけではありません。実際のハッシュを作成するようにオブジェクトを改善してください。

于 2009-05-07T15:27:12.703 に答える
2

「Equals 契約に違反している」場合は、それをキーとして使用する必要があるかどうかわかりません。

何かがそれをキーとして使用しているため、ハッシュを正しく行う必要があります...ロジックが何であるかは非常に不明ですEqualsが、等しいと見なされる2つの値には同じハッシュコードが必要です。同じハッシュ コードを持つ 2 つの値が等しい必要はありません。

定数文字列を使用してもあまり役に立ちません。値は型ごとに均等に分割されますが、それだけです...

于 2009-05-07T15:29:00.423 に答える
1

ハッシュの競合が発生すると、HashTable/Dictionary は Equals を呼び出して、探しているキーを見つけます。定数ハッシュ コードを使用すると、そもそもハッシュを使用する速度の利点が失われます。つまり、線形検索になります。

あなたは、契約に従って Equals メソッドが実装されていないと言っています。これは正確にはどういう意味ですか?違反の種類に応じて、HashTable または Dictionary は単に遅くなる (線形検索) か、まったく機能しません。

于 2009-05-07T15:32:21.303 に答える