1

特定のオブジェクトに独自のカスタム ハッシュコードを実装することを検討しています...これをkey辞書として使用します。2 つのオブジェクトが同じハッシュコードを持つ可能性がある (可能性が高い) ため、どの追加の演算子をオーバーライドする必要があり、そのオーバーライドは (概念的に) どのように見えるべきでしょうか?

   myDictionary.Add(myObj.GetHashCode(),myObj);

   myDictionary.Add(myObj,myObj);

言い換えれば、一意性とオブジェクトを配置するバケットを決定するために、ディクショナリは次の組み合わせを使用しますか?

どれが他のものよりも重要ですか?

  • ハッシュコード
  • 等しい
  • ==
  • CompareTo()

compareTo は SortedDictionary でのみ必要ですか?

4

2 に答える 2

2

GetHashCode は何に使用されますか?

これは、設計上、オブジェクトをハッシュ テーブルに配置する場合にのみ役立ちます。したがって、名前。

GetHashCode は、ハッシュ テーブルのバランスを取るという 1 つのことだけを行うように設計されています。それ以外には使用しないでください。特に:

  • オブジェクトの一意のキーは提供しません。衝突の可能性が非常に高いです。
  • 暗号強度がないため、デジタル署名の一部として、または同等のパスワードとして使用しないでください。
  • チェックサムに必要なエラー検出プロパティを必ずしも備えているわけではありません。

等々。

エリック・リッパート

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

于 2012-05-23T21:59:33.607 に答える
1

問題の原因はバケットではありません。実際には、ハッシュ コードを使用してバケットを特定すると、適切なオブジェクト インスタンスが検出されます。バケット内のすべてのオブジェクトは同じハッシュ コードを共有するため、オブジェクトの等価性 ( Equals) を使用して正しいオブジェクトを見つけます。ルールは、2 つのオブジェクトが等しいと見なされる場合、同じハッシュ コードを生成する必要がありますが、同じハッシュ コードを生成する 2 つのオブジェクトは等しくない可能性があります。

于 2012-05-23T21:59:24.257 に答える