为什么xor运算符用于计算哈希码?

Pau*_*ley 9 .net c#

在这篇MSDN文章 http://msdn.microsoft.com/en-us/library/ms132123.aspx中, 它讨论了Class Equalitycomparer并有一个例子.在这个关于比较它的例子中它有这个类 -

class BoxSameDimensions : EqualityComparer<Box>
{
    public override bool Equals(Box b1, Box b2)
    {
        if (b1.Height == b2.Height & b1.Length == b2.Length
            & b1.Width == b2.Width)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public override int GetHashCode(Box bx)
    {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白行hCode = bx.Height ^ bx.Length ^ bx.Width;

有人可以解释一下吗?为什么xor?

Mat*_*son 7

^操作是按位异或运算符.

在这种情况下,它被用作从三个整数生成哈希码的便捷方式.(我不认为这是一个非常好的方式,但这是一个不同的问题......)

奇怪的是,在构造哈希代码之后,他们GetHashCode()再次使用它,这对于int来说完全没有意义,因为它只返回int本身 - 所以它是一个无操作.

这就是他们应该写的:

public override int GetHashCode(Box bx)
{
    return bx.Height ^ bx.Length ^ bx.Width;
}
Run Code Online (Sandbox Code Playgroud)

这个SO答案解释了为什么XOR有时运行得很好:为什么XOR经常在java hashCode()中使用,但很少使用其他按位运算符?

注意:我不喜欢使用xor作为三个整数的哈希码的原因是因为:

a ^ b ^ a == b
Run Code Online (Sandbox Code Playgroud)

换句话说,如果对哈希代码有贡献的第一个和最后一个int是相同的,它们根本不会对最终的哈希代码做出贡献 - 它们相互抵消,结果总是中间的int.

如果你只使用两个整数,那就更糟了,因为:

a ^ a == 0
Run Code Online (Sandbox Code Playgroud)

因此,对于两个整数,对于它们相同的所有情况,哈希码将为零.


归档时间:

查看次数:

3531 次

最近记录:

11 年,6 月 前