簡體   English   中英

GetHashCode()與^

[英]GetHashCode() with ^

GetHashCode()函數使用contains ^ symbol代碼返回內容時,它是否有一些特殊含義?

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();
    }
}

^是C# XOR運算符 沒有什么“特別”的,只是所有類屬性的哈希碼都是異或的。

編輯GetHashCode返回一個通用代碼,用作復雜對象的速記標識符。 當您想要存儲對象然后根據其哈希代碼快速檢索它們時,常見的用途是散列數據結構。 假設一個Person類和一些具有相應哈希碼的對象:

Alex 8540
John 9435
Peter 2453

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

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

使用各自的哈希碼將對象存儲在表內以確定位置。 接下來,可以使用相同的哈希代碼輕松檢索它們。

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

那只是按位xor運算符 它通常用於將來自不同對象的哈希碼組合成單個整體哈希碼。

這不是Google最容易搜索的內容之一! 我在搜索這些東西時的提示是查看所有運算符表格

那是bitwize XOR運算符

這是實現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(); }
}

當Bar == 2和Baz == 4時,將創建相同的哈希碼,如Bar == 4和Baz == 2。 根據用例,這可能會導致更多的哈希沖突,因此在實現GetHashCode時需要注意一些事項。 此外 - 當您創建這樣的可變類型時,您應該非常小心,以便您的哈希代碼實現與您的相等性檢查等相匹配。

按位XOR運算符的工作方式如下:

A = 10111 B = 01010

A ^ B = 11101

不同的對應位在1中重新排列,類似的導致0。

在您的情況下,這些整數首先被轉換為二進制,然后如上例所示進行處理。

^如果C#中的XOR運算符在這里看到: http//msdn.microsoft.com/en-us/library/zkacc7k1.aspx

你所有的例子都是從它的屬性中對哈希碼進行異或。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM