目前,我有以下两种枚举类型:
[Flags]
public enum KeyboardLocks :
byte
{
None = 0,
NumLock = 1 << 0,
CapsLock = 1 << 1,
ScrollLock = 1 << 2
}
[Flags]
public enum KeyboardModifiers :
byte
{
None = 0,
LeftAlt = 1 << 0,
LeftControl = 1 << 1,
LeftShift = 1 << 2,
RightAlt = 1 << 3,
RightControl = 1 << 4,
RightShift = 1 << 5
}
这些都包装在一个状态对象中,表示键盘上修改键的状态:
public struct ModifierState
{
// (Constructor and get-only properties omitted)
public readonly KeyboardLocks Locks;
public readonly KeyboardModifiers Modifiers;
public override int GetHashCode()
{
int hash = 19;
hash = (hash * 257) + Locks.GetHashCode();
hash = (hash * 257) + Modifiers.GetHashCode();
return hash;
}
}
在做了一些研究之后,我发现GetHashCode()
只会返回byte
和int
的值。我查看了other questions,看来最好的方法是挑选don't overlap with the internal hash table两个素数。
我注意到,如果按照建议使用17
和23
,值会定期发生碰撞(至少根据我制作的电子表格)。 我使用的是19和257,因为它会为每个枚举分配一个唯一值。
我在这里错过了这一点吗?我很少制作需要覆盖GetHashCode()
的类型,所以我不知道这是否是远程正确的。