簡體   English   中英

GetHashCode為不同的位標志枚舉返回相同的值

[英]GetHashCode returning same Value for the different Bit Flag Enums

我有標志類型枚舉,每個元素的按位表示如下

[DataContract]
[Flags]
public enum TestProduct : long
{
    [EnumMember]
    A1 = 0x1,
    [EnumMember]
    A2 = 0x2,
    [EnumMember]
    A3 = 0x4,
    [EnumMember]
    A4 = 0x8,
    [EnumMember]
    A5 = 0x40,
    [EnumMember]
    A6 =0x4000000000,
}

我將其歸為Flags Enum,因為我需要存儲這些條目的組合。 我在這里面臨的問題是,我確實有一個通用代碼來檢查HasCode,然后如果HashCode不為零,則進行一些操作。

在這種情況下,我得到相同的具有元素A5和A6返回的代碼值,該代碼值返回為64(0x40的二進制值)。

如果我同時使用A5和A6,則它的哈希碼為零。 有人可以建議我如何處理這種情況,以免對此組合取零值,為什么兩者都給出與A5相同的哈希碼。

下面的代碼顯示了它的表示方式。

static void Main(string[] args)
{
    Console.Write("Hash Code for A5 is ");
    Console.WriteLine(Enums.TestProduct.A5.GetHashCode());
    Console.Write("Hash Code for A6 is ");
    Console.WriteLine(Enums.TestProduct.A6.GetHashCode());
    Console.Write("Hash Code for A6 | A5 is ");
    Console.WriteLine((Enums.TestProduct.A6 | Enums.TestProduct.A5).GetHashCode());
    Console.ReadLine();
}

結果如下: 在此處輸入圖片說明

只要GetHashCode始終返回相同的值,它對於返回枚舉值所喜歡的任何值都是完全有效的。

盡管定義了實現,但我懷疑A6獲得64和A6獲得0的原因A6 | A5 A6 | A5 GetHashCode long類型的GetHashCode的實現。 由於GetHashCode需要返回一個int (32位),因此它將不得不做一些額外的處理來對long (64位)進行哈希處理。

如果查看Long.GetHashCode的參考源實現,您會發現它的高32位與低32位互斥或。 對於A6 ,它是0x4000000000它將是0x40 | 0x00 0x40 | 0x00 ,即0x40 (64)。

對於A6 | A5 A6 | A5您將得到0x4000000040 ,當高32位與低32位進行異或時,將為0x40 | 0x40 0x4000000040 0x40 | 0x40 0x40 | 0x40 ,這將為您提供0。

暫無
暫無

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

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