为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
陪伴而非守候 2021-04-10 13:19:37
我想GetHashCode用以下代码覆盖一个方法:public override int GetHashCode(){    var magicNumber1 = 5;    var magicNumber2 = 3;    return intType * magicNumber1 +           (int)enumType * magicNumber2;}GetHashCode当一个值是Integer而第二个是Enum时,这是返回的正确方法吗?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

好吧,您当前的实现还可以,但是如果和范围较小,则可以更好。假设(几乎总是)在,并且在范围内,则intTypeenumTypeintType[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);

   }

并期望完全没有碰撞


查看完整回答
反对 回复 2021-04-17
  • 1 回答
  • 0 关注
  • 292 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信