我知道使用「可變」對象是不可取的(對象的GetHashCode()方法可以在Dictionary中用作鍵時返回不同的結果)。.NET Dictionary實現如何與可變對象一起工作
下面是我的字典,這是作爲一個哈希表來實現,如何工作的理解:
當我添加新鍵,例如dict.Add(m1, "initially here was m1 object");
,dict
計算m1
使用GetHashCode()
方法的哈希碼。然後它進行一些內部計算並最終將該對象放入其內部數組的某個位置。
當我使用密鑰索引獲取值時,例如dict[m1]
,dict
再次計算哈希碼。然後它進行了一些內部計算,它給了我一個位於其內部數組內部的計算位置的對象。
但我認爲有一個我找不到的錯誤。
所以讓我們假設我有這樣的代碼:
class MutableObject
{
Int32 m_value;
public MutableObject(Int32 value)
{
m_value = value;
}
public void Mutate(Int32 value)
{
m_value = value;
}
public override int GetHashCode()
{
return m_value;
}
}
static void Main(string[] args)
{
MutableObject m1 = new MutableObject(1);
MutableObject m2 = new MutableObject(2);
var dict = new Dictionary<MutableObject, String>();
dict.Add(m1, "initially here was m1 object");
dict.Add(m2, "initially here was m2 object");
Console.WriteLine("Before mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
m1.Mutate(2);
m2.Mutate(1);
Console.WriteLine("After mutation:");
Console.WriteLine("dict[m1] = " + dict[m1]);
Console.WriteLine("dict[m2] = " + dict[m2]);
Console.ReadKey(true);
}
當我打電話Mutate
方法,密鑰交換。所以我認爲它會給交換結果。但實際上這條線:Console.WriteLine("dict[m1] = " + dict[m1]);
拋出KeyNotFoundException,我不明白爲什麼。很明顯,我在這裏丟失了一些東西......
只有40億個可能的散列碼。假設運氣不好,在同一個散列表中有兩個不相同的對象,它們使用相同的散列碼。 *字典如何區分他們*?當你回答這個問題時,你會明白你的計劃爲什麼會給你看到的結果。 – 2013-03-12 19:16:40
我知道hasttable可以實現鏈接,或者打開alghoritms來處理碰撞。所以當我打電話給'dict [m1]'時,他得到了散列碼,在交換後等於2,然後...他做了什麼?他試圖弄清楚,使用這個哈希碼的對象是正確的,他應該返回哪個對象...... – acrilige 2013-03-12 19:27:23
你在1 Elm Street購買房子,然後在2 Elm Street買房子並搬到那裏。您將第二間房屋的地址標誌更改爲1 Elm Street。去榆樹街1號的郵件到達哪裏? – 2013-03-12 19:31:40