覆盖GetHashCode(枚举加整数比较)

Overwriting GetHashCode (Enum plus Integer comparison)

我想用以下代码覆盖 GetHashCode 方法:

public override int GetHashCode()
{
    var magicNumber1 = 5;
    var magicNumber2 = 3;

    return intType * magicNumber1 + 
          (int)enumType * magicNumber2;
}

当一个值为 Integer 且第二个值为 Enum 时,这是返回 GetHashCode 的正确方法吗?

好吧,你目前的实现还不错,但如果 intTypeenumType 小,你可以 更好 范围。 假设 intType(几乎总是)在 [0..1000000] 范围内,而 enumType[0..10] 范围内,那么

   public override int GetHashCode() {
      return unchecked(intType * 10 + (int)enumType);
   }

将是一个更好的选择:当前代码中出现的许多散列冲突在上面的代码中不是这样。例如

   intType | enumType | old hash | suggested
   -----------------------------------------
         0          5         15           5
         3          0         15          30  

编辑:在你的情况下(请参阅评论)

it should not be more than 100

假设你没有负值,你可以试试

   public override int GetHashCode() {
     // * 128 == << 7 may be faster than * 100 at some systems 
     return unchecked(intType * 128 + (int)enumType);
   }

并期望完全没有碰撞