如何处理 GetHashCode() 中的溢出

How to handle overflow in GetHashCode()

我正在为我的 Vector class 覆盖 GetHashCode() 函数。它只包含 3 个浮点数 XYZ。我想知道最好的方法是什么。

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 从不抛出任何异常