如何判断我的GetHashCode()函数是否合适?

时间:2015-05-17 17:28:32

标签: c# enums gethashcode

目前,我有以下两种枚举类型:

[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()只会返回byteint的值。我查看了other questions,看来最好的方法是挑选don't overlap with the internal hash table两个素数。

我注意到,如果按照建议使用1723,值会定期发生碰撞(至少根据我制作的电子表格)。 我使用的是19和257,因为它会为每个枚举分配一个唯一值。

我在这里错过了这一点吗?我很少制作需要覆盖GetHashCode()的类型,所以我不知道这是否是远程正确的。

0 个答案:

没有答案