2

ハッシュテーブルでのキーの並べ替え/挿入チェックがどのように機能するかを理解しようとしています。オブジェクトをハッシュテーブルに追加すると、実行時に同じキーがまだ入力されていないかどうかがチェックされることを理解しました。

私のテストでは、キーが入力される2つのハッシュテーブルがあります。1-整数2-常に1を返すようにGetHashCodeメソッドをオーバーライドしたオブジェクト。

ここでの私の問題:同じintキーを追加すると最初のテストが壊れていますが、2番目のテストは壊れていません!どうして?挿入時にチェックする必要のあるハッシュコードはすべて1を返します。

前もって感謝します!


私のコード:

class Collections
{
    public Collections()
    {
        // Testing a hashtable with integer keys
        Dictionary<int, string> d1 = new Dictionary<int, string>();
        d1.Add(1, "one");
        d1.Add(2, "two");
        d1.Add(3, "three");
        // d1.Add(3, "three"); // Cannot add the same key, i.e. same hashcode
        foreach (int key in d1.Keys)
            Console.WriteLine(key);

        // Testing a hashtable with objects returning only 1 as hashcode for its keys
        Dictionary<Hashkey, string> d2 = new Dictionary<Hashkey, string>();
        d2.Add(new Hashkey(1), "one");
        d2.Add(new Hashkey(2), "two");
        d2.Add(new Hashkey(3), "three");
        d2.Add(new Hashkey(3), "three");
        for (int i = 0; i < d2.Count; i++)
            Console.WriteLine(d2.Keys.ElementAt(i).ToString());

    }


}

/// <summary>
/// Creating a class that is serving as a key of a hasf table, overring the GetHashcode() of System.Object
/// </summary>
class Hashkey
{
    public int Key { get; set; }

    public Hashkey(int key)
    {
        this.Key = key;
    }

    // Overriding the Hashcode to return always 1
    public override int GetHashCode()
    {
        return 1;
        // return base.GetHashCode();
    }

    // No override
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    // returning the name of the object
    public override string ToString()
    {
        return this.Key.ToString();
    }        
}

}

4

3 に答える 3

4

Dictionaryハッシュコードオブジェクトの同等性をチェックします。ハッシュは、おそらく等しいキーを非常に効率的に見つけるための「最初の近似」を考え出すために使用されます。

のオーバーライドはEquals、参照の同等性を使用する基本実装に委任するだけです。つまり、プロパティHashKeyの値が同じであっても、の2つの異なるインスタンスは等しくありません。Key

あなたは実際に何を達成しようとしていますか?それとも、お互いにどのようGetHashCodeに関係しているのかを理解しようとしているだけですか?Equals

于 2010-11-15T09:21:29.057 に答える
3

ハッシュコードは、アイテムを格納する適切なバケットを選択するためのヒューリスティックにすぎません。2つのアイテムが同じハッシュコードを共有しているからといって、それらが等しいとは限りません。衝突の場合(1つのハッシュコードで発生するように)、バケット内の単純な検索に戻り、検索されたキーと等しいメンバーを見つけます。同等性テストでは参照が同じかどうかをチェックしているため、2つの項目が等しくなることはありません。

于 2010-11-15T09:23:22.817 に答える
1

Equals、の参照を比較しますHashKey

それは異なるインスタンスであるため、それらは等しくありません。

次のEqualsようになります。

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(this, obj))
            return true;

        var other = obj as Hashkey;

        return
            other != null &&
            Key.Equals(other.Key);
    }
于 2010-11-15T09:23:32.833 に答える