覆盖GetHashCode(枚举加整数比较)
Overwriting GetHashCode (Enum plus Integer comparison)
我想用以下代码覆盖 GetHashCode
方法:
public override int GetHashCode()
{
var magicNumber1 = 5;
var magicNumber2 = 3;
return intType * magicNumber1 +
(int)enumType * magicNumber2;
}
当一个值为 Integer 且第二个值为 Enum 时,这是返回 GetHashCode
的正确方法吗?
好吧,你目前的实现还不错,但如果 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
编辑:在你的情况下(请参阅评论)
it should not be more than 100
假设你没有负值,你可以试试
public override int GetHashCode() {
// * 128 == << 7 may be faster than * 100 at some systems
return unchecked(intType * 128 + (int)enumType);
}
并期望完全没有碰撞
我想用以下代码覆盖 GetHashCode
方法:
public override int GetHashCode()
{
var magicNumber1 = 5;
var magicNumber2 = 3;
return intType * magicNumber1 +
(int)enumType * magicNumber2;
}
当一个值为 Integer 且第二个值为 Enum 时,这是返回 GetHashCode
的正确方法吗?
好吧,你目前的实现还不错,但如果 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
编辑:在你的情况下(请参阅评论)
it should not be more than 100
假设你没有负值,你可以试试
public override int GetHashCode() {
// * 128 == << 7 may be faster than * 100 at some systems
return unchecked(intType * 128 + (int)enumType);
}
并期望完全没有碰撞