c# - GetHashCode 为不同的位标志枚举返回相同的值
问题描述
我有每个元素的按位表示的标志类型枚举,如下所示
[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 返回相同的 Has 代码值,返回为 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
,只要它总是返回相同的值。
虽然它是定义的实现,但我怀疑你得到 64 forA6
和 0 for的原因是因为类型A6 | A5
的实现。由于需要返回一个(即 32 位),它必须做一些额外的处理来散列 a (即 64 位)。GetHashCode
long
GetHashCode
int
long
如果您查看Long.GetHashCode的参考源实现,您会发现它是高 32 位与低 32 位的异或。对于A6
哪个是0x4000000000
这将是0x40 | 0x00
哪个0x40
(64)。
因为A6 | A5
你最终会得到0x4000000040
,当高 32 位与低 32 位异或时,0x40 | 0x40
它会给你 0。
推荐阅读
- python - 如何将列表的值插入嵌套列表?
- vba - 如果 2 个不同的用户在 VBA 中同时运行一个进程,如何防止该进程运行两次?
- sql - 如何在 sql 中允许重复值?
- r - 计算排除 R 中某些列的行的平均值
- amazon-quicksight - Quicksight“管理数据集”不显示任何数据集,即使我设置了一些数据集并且它们正在使用中
- sql - SQL Server 通过遍历字段名将图像导出到硬盘
- webgl - 有没有办法直接通过 webGL 渲染广色域颜色(lch、lab 等)?
- java - 正则表达式替换嵌入在开放花括号中并后跟等号和数字的所有子字符串
- angular - 发送前更改表单的特定值
- c++ - lld 是否有任何 C++ API?