2012-05-22 91 views
5

GetHashCode()函數返回使用代碼的代碼時它有一些特殊含義嗎?contains^symbolGetHashCode()with^

public class ClassProp 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public int Prop4 { get; set; } 
    public int Prop5 { get; set; } 

    public override int GetHashCode() 
    { 
     return Prop1.GetHashCode()^Prop2.GetHashCode()^
       Prop3.GetHashCode()^Prop4.GetHashCode()^Prop5.GetHashCode(); 
    } 
} 
+0

許多答案指出,這不是XOR算子。它在這裏用來創建一個組合的哈希碼。看看這篇文章在這裏:http://stackoverflow.com/questions/1079192/is-it-possible-to-combine-hash-codes-for-private-members-to-generate-a-new- hash –

回答

4

這只是bitwise xor operator。它通常用於將來自不同對象的散列碼組合成單個總體散列碼。

這不是在Google上搜索最簡單的東西之一!當我搜索這些東西時,我的提示是查看table of all operators

+0

你能分享一個簡單的實例來理解何時在實際項目中使用GetHashCode()函數嗎? – Nilish

+0

您通常不會自己調用'GetHashCode'。但是該框架將其用於平等測試,字典散列等。大多數情況下,您可以依靠默認實現逃脫。 –

+0

你在說這個'公共覆蓋布爾Equals(Object obj) {}'?如果是這樣,這兩者之間的關係是什麼? – Nilish

4

^是C#XOR operator。沒有關於它的任何「特殊」,只是所有類屬性的哈希碼一起異或。

編輯GetHashCode返回一個通用代碼,用作複雜對象的簡寫標識符。當您想要存儲對象並根據其哈希代碼快速檢索它們時,通常會使用哈希數據結構。假設一類Person並與相應的散列碼的某些對象:

Alex 8540 
John 9435 
Peter 2453 

這些代碼是基於一些或每個對象的所有字段生成並必須儘可能少地碰撞,以確保有效的散列。現在,我們可以存儲使用散列碼在哈希表中的對象:

Entries 
0 -> Alex 
1 -> John 
2 -> Peter 

的對象被存儲使用其各自的散列碼,以確定位置在表內。接下來,他們可以通過使用相同的散列碼輕鬆檢索。

我建議你找一些有關哈希表如何工作的文獻,因爲在SO文章中解釋太多了。

+0

你能分享一個簡單的實例來理解何時在現實生活中使用GetHashCode()函數? – Nilish

+0

@Kanav:看我的編輯。 – Tudor

+0

你的字典裏有一篇非常基本的文章(鏈接)嗎? – Nilish

0

按位XOR運算符的工作原理如下:

A = 10111 B = 01010

甲^ B = 11101

不同correspoding位在1 resutl,類似於那些導致0

在你的情況下,這些整數首先被轉換爲二進制,然後像上面的例子那樣處理。

2

這就是bitwize XOR operator

這是在執行GetHashCode時使用的非常普遍的操作符。

這就是說,在這種情況下,該實現可能並不理想。使用XOR(單獨)的問題是您不一定減少碰撞的機會。問題是,像這樣定義的類:

class Foo 
{ 
    public int Bar { get; set; } 
    public int Baz { get; set; } 

    // ... 
    public override int GetHashCode() 
    { return this.Bar.GetHashCode()^this.Baz.GetHashCode(); } 
} 

將創建相同的散列碼的時候吧== 2和巴茲== 4當酒吧== 4和巴茲== 2。根據用例,這可能會導致更多的散列衝突,所以在實現GetHashCode時需要注意。另外 - 當你製作這樣一個可變類型時,你應該非常小心,你的哈希碼實現匹配你的相等性檢查等。

+1

你能分享一個簡單的實例來理解何時在實際項目中使用GetHashCode()函數嗎? – Nilish