我想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);
}
并期望完全没有碰撞
- 1 回答
- 0 关注
- 292 浏览
添加回答
举报
0/150
提交
取消