[英]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.