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

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


public override int GetHashCode()

{

    var magicNumber1 = 5;

    var magicNumber2 = 3;


    return intType * magicNumber1 + 

          (int)enumType * magicNumber2;

}

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


陪伴而非守候
浏览 293回答 1
1回答

白板的微信

好吧,您当前的实现还可以,但是如果和范围较小,则可以更好。假设(几乎总是)在,并且在范围内,则intTypeenumTypeintType[0..1000000]enumType[0..10]&nbsp; &nbsp;public override int GetHashCode() {&nbsp; &nbsp; &nbsp; return unchecked(intType * 10 + (int)enumType);&nbsp; &nbsp;}将会是一个更好的选择:当前代码中存在的许多哈希冲突在上面的代码中并不存在。例如&nbsp; &nbsp;intType | enumType | old hash | suggested&nbsp; &nbsp;-----------------------------------------&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;15&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 30&nbsp;&nbsp;编辑:根据您的情况(请查看评论)它不应该超过100假设您没有负值,则可以尝试&nbsp; &nbsp;public override int GetHashCode() {&nbsp; &nbsp; &nbsp;// * 128 == << 7 may be faster than * 100 at some systems&nbsp;&nbsp; &nbsp; &nbsp;return unchecked(intType * 128 + (int)enumType);&nbsp; &nbsp;}并期望完全没有碰撞
打开App,查看更多内容
随时随地看视频慕课网APP