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