如何处理 GetHashCode() 中的溢出
How to handle overflow in GetHashCode()
我正在为我的 Vector class 覆盖 GetHashCode()
函数。它只包含 3 个浮点数 X
、Y
、Z
。我想知道最好的方法是什么。
public override int GetHashCode()
{
var sum = X + 3 * Y + 5 * Z;
return sum.GetHashCode();
}
我需要它来在大集合中快速找到 Vector。
我不想只 return X.GetHashCode()
左右,因为这会导致对直线进行太多等式检查。
我当前实现的问题是,如果浮点数真的很大,我可能会得到 整数溢出。
有没有办法告诉我的编译器只删除任何溢出?
有更好的解决方案吗?
提前致谢。
Is there a way to tell my compiler to just cut out any overflow?
是的,您可以为此使用 unchecked 关键字。正如@kalimag 指出的那样,只有整数值才会在溢出时抛出异常。
Is there a better Solution?
合并哈希值的正确方法是:
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + X.GetHashCode();
hash = hash * 23 + Y.GetHashCode();
hash = hash * 23 + Z.GetHashCode();
return hash;
}
}
请参阅 this question 了解说明。
通常,我们将哈希码与 xor 结合使用(更好的解决方案):
public override int GetHashCode() =>
X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
详情见Why is XOR the default way to combine hashes?
xor 从不抛出任何异常
我正在为我的 Vector class 覆盖 GetHashCode()
函数。它只包含 3 个浮点数 X
、Y
、Z
。我想知道最好的方法是什么。
public override int GetHashCode()
{
var sum = X + 3 * Y + 5 * Z;
return sum.GetHashCode();
}
我需要它来在大集合中快速找到 Vector。
我不想只 return X.GetHashCode()
左右,因为这会导致对直线进行太多等式检查。
我当前实现的问题是,如果浮点数真的很大,我可能会得到 整数溢出。
有没有办法告诉我的编译器只删除任何溢出?
有更好的解决方案吗?
提前致谢。
Is there a way to tell my compiler to just cut out any overflow?
是的,您可以为此使用 unchecked 关键字。正如@kalimag 指出的那样,只有整数值才会在溢出时抛出异常。
Is there a better Solution?
合并哈希值的正确方法是:
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + X.GetHashCode();
hash = hash * 23 + Y.GetHashCode();
hash = hash * 23 + Z.GetHashCode();
return hash;
}
}
请参阅 this question 了解说明。
通常,我们将哈希码与 xor 结合使用(更好的解决方案):
public override int GetHashCode() =>
X.GetHashCode() ^ Y.GetHashCode() ^ Z.GetHashCode();
详情见Why is XOR the default way to combine hashes?
xor 从不抛出任何异常