2009-06-11 4 views
0

2つの辞書に同じキーと値が含まれていれば、同じハッシュコードを返すと思いますか?同じキーと値が含まれている場合、同じハッシュコードを返すように2人の辞書を取得するにはどうすればよいですか?Cの辞書の一貫したハッシュコード

ありがとうございました。以下のコードは同じです - ハッシュコードは異なります。

SortedDictionary sd1 = new SortedDictionary(); sd1.Add(1、 "one"); sd1.Add(2、 "two"); sd1.Add(5、 "five"); int sd1Hash = sd1.GetHashCode();

SortedDictionary<int, string> sd2 = new SortedDictionary<int, string>(); 
    sd2.Add(1, "one"); 
    sd2.Add(2, "two"); 
    sd2.Add(5, "five"); 
    int sd2Hash = sd2.GetHashCode(); 
+1

タイプがハッシュテーブルのキーとして使用されると予想される場合にのみ、ハッシュコードは同じで、SortedDictionaryでは期待できません。 –

答えて

3

参照型の場合、ハッシュコードはオブジェクト自体ではなく参照に基づいて定義されます。 2つのディクショナリが同じオブジェクトを指している場合、hadhcodesは同じになります。

独自のクラスのGetHashCodeメソッドをオーバーライドして、辞書の内容に基づいてカスタムハッシュコードを作成することができますが、これはユーザーの期待に反します。おそらくisn '良いアイデアです。私は2つの辞書を取ってそれらの値を比較することによってそれらを比較する拡張メソッドまたはIComparerを書いています。

-3

私が信じるハッシュコードは、インスタンスにも依存します。

新しいクラスを作成するには、SortedDictionaryクラスから継承します。次に、GetHashCode()をオーバーライドします。

あなたは.NETリフレクターを使用している場合

class SortedHasher : SortedDictionary<int, string> 
{ 
    public override int GetHashCode() 
    { 
     int hash = 0; 
     foreach(KeyValuePair<int, string> kvp in this) 
     { 
     hash += kvp.Key.GetHashCode() + kvp.Value.GetHashCode(); 
     } 
     return hash; 
    } 
} 
+0

Ian:これを使用します技術は、コレクション内のアイテムが追加、削除、または更新されるたびに、ハッシュコードが変更されることを意味します。非常に良い考えではありません。 – LukeH

+2

これは本当に本当に悪いです。 GetHashCodeの実装により、同じ内容のハッシュコードを持つ辞書が作成される可能性があります。辞書の内容のハッシュコードを合計すると、実際の問題を引き起こす可能性があります。イメージング{1,2}と{2,1}を含む2つの辞書あなたのメソッドでは、両方とも同じハッシュコードが得られます。 GetHashCodeをオーバーライドするときは、2つの異なるオブジェクトが決して同じハッシュコードで終わることがないようにすることが重要です。 –

+0

@Simon:2つの異なるオブジェクトが同じハッシュコードを返す場合、必ずしも世界の終わりではありません。 http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspxの「備考」を参照してください。 – LukeH

2

は、あなたがSortedDictionaryの定義を見てみることができ、それがGetHashCodeを上書きしないので、それが返す値は、キーと値のいずれかの方法で依存しません。