在這裏看到的默認實現: http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
GetHashCode方法的默認實現不保證唯一的返回值不同的對象。此外,.NET Framework不保證GetHashCode方法的默認實現,並且它返回的值在不同版本的.NET Framework之間將保持不變。因此,此方法的默認實現不能用作用於散列目的的唯一對象標識符。
但我覺得你真的想知道的是哈希碼是如何工作的。
比方說,你有下面的類:
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
}
現在,讓我們說你要比較兩個人,檢查他們是否有相同的名字,你是怎麼做到這一點?您重寫在Object中實現的等於。 (在C#中的所有類繼承對象隱含的) 像這樣:
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
public override bool Equals(Object obj)
{
if(obj == null)
return false // not equal if obj is null
Equals temp = obj as Equals; // temp set to null if obj can not be cast to equals
if(p == null)
return false
// if code gets here, the code object passed is an instance of Equals.
// Now we have to check if the strings match.
bool isEqual = p.name == this.name; // set if the two names match
return isEqual; // return if these two match
}
}
所以,現在,你可以檢查,如果兩個人都是平等的。 例子:
Person p1 = new Person("Jack");
Person p2 = new Person("Jack");
Person p3 = new Person("Jill");
Object p4 = new Person("Jill");
p1.Equals(p2) // returns true
p1.Equals(p3) // returns false
p4.Equals(p1) // returns false
p4.Equals(p3) // returns true
現在,讓我們說你有一個巨大的人一樣,一百萬的列表,你想知道,如果命名"amy"
的人在這個列表中存在。你如何找到這個人?你會一個一個地循環所有的名字,並檢查這個人是否等於艾米?但是這樣會很慢,如果艾米是這個名單中的第100萬人呢?我們如何提高性能?
輸入哈希碼。
讓我們假設你寫一個簡單的哈希碼算法: 哈希碼是人名中每個字母的每個數字的總和。
public Person
{
private string name;
public Person(Name name)
{
this.name = name;
}
public override bool Equals(Object obj)
{
if(obj == null)
return false // not equal if obj is null
Equals temp = obj as Equals; // temp set to null if obj can not be cast to equals
if(p == null)
return false
// if code gets here, the code object passed is an instance of Equals.
// Now we have to check if the strings match.
bool isEqual = p.name == this.name; // set if the two names match
return isEqual; // return if these two match
}
public override int GetHashCode()
{
int sum = 0;
foreach(char c in this.name)
{
sum += c;
}
return sum;
}
}
因此,如果我們有amy
她的哈希碼會1 + 13 + 25
,所以38
。
現在不是一個普通的列表,而是有一個名爲「桶」的列表。你的散列碼決定你去哪個桶。 amy
has hascode如果38
她去桶38
。
現在讓我們說我們有另外一個人,名字may
,她有她的名字相同的字母,所以她的哈希碼也38
,她也進入水桶現在38
,只要你想,以檢查是否艾米存在在這個列表中。我們首先檢查她的哈希碼,其中38
,現在我們去查看桶38,並且循環遍歷桶38
中的所有對象,我們檢查桶38
中的任何對象是否匹配amy,如果爲true,則返回true,如果爲false,則返回false 。所以如果你有一百萬人,那麼你必須做的檢查清單才能知道amy
是否存在於這個清單中,這個清單會大大減少。
所以基本上,如果你要使用的哈希碼你得遵守以下規則:
- 您必須覆蓋&實現equals如果你要使用的哈希碼。
- 的兩個對象,其中的Equals返回true,就必須有相同的hashCode
- 兩個對象是不同的可能具有相同的哈希碼,但不一定必須是相同的。
這基本上就是它的要義。
你運行過嗎?結果是什麼?測試你自己的時間比在這裏問的要少得多。 – Oded
您不希望它們具有相同的哈希碼。 –
@已付給你的權利,但我試圖在sa字符串上,我得到了相同的結果,然後在這個類上嘗試它,並得到了相同的rsult,令人困惑 – Star