gpt4 book ai didi

c# - GetHashCode 为不同的位标志枚举返回相同的值

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:29 25 4
gpt4 key购买 nike

我有 Flag 类型枚举,每个元素的按位表示如下

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

结果如下: enter image description here

最佳答案

GetHashCode 为枚举值返回它喜欢的任何值是完全有效的,只要它始终返回相同的值即可。

虽然它是实现定义的,但我怀疑你得到 64 for A6 和 0 for A6 | 的原因A5 归结为 long 类型的 GetHashCode 的实现。由于 GetHashCode 需要返回一个 int(它是 32 位),它必须做一些额外的处理来散列一个 long(它是 64 位)。

如果您查看 Long.GetHashCode 的引用源实现您会看到它是高 32 位与低 32 位异或。对于 A6 这是 0x4000000000 这将是 0x40 | 0x000x40 (64)。

对于 A6 | A5 你最终会得到 0x4000000040,当高 32 位与低 32 位异或时,它将是 0x40 | 0x40 将为您提供 0。

关于c# - GetHashCode 为不同的位标志枚举返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55825236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com