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

时间:2018-04-12 12:18:25

标签: c# gethashcode

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

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

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

当一个值为整数而第二个枚举时,这是返回GetHashCode的正确方法吗?

1 个答案:

答案 0 :(得分:1)

嗯,您目前的实施情况还不错,但如果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  

修改:在您的情况下(请参阅评论)

  

它不应该超过100

假设您没有负值,您可以尝试

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

并期望完全没有碰撞