我想用以下代码覆盖GetHashCode
方法:
public override int GetHashCode()
{
var magicNumber1 = 5;
var magicNumber2 = 3;
return intType * magicNumber1 +
(int)enumType * magicNumber2;
}
当一个值为整数而第二个枚举时,这是返回GetHashCode
的正确方法吗?
答案 0 :(得分:1)
嗯,您目前的实施情况还不错,但如果intType
和enumType
小范围,您可以更好。
假设,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);
}
并期望完全没有碰撞