繁体   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