12

In this MSDN article http://msdn.microsoft.com/en-us/library/ms132123.aspx it discusses the Class Equalitycomparer and has an example.In this example about comparing boxes it has this class -

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();
    }
}

I don't understand the line int hCode = bx.Height ^ bx.Length ^ bx.Width;

Could someone explain please? Why the xor?

4

2 回答 2

11

^运算符是按位异或运算符。

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

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

他们应该是这样写的:

public override int GetHashCode(Box bx)
{
    return bx.Height ^ bx.Length ^ bx.Width;
}

这个 SO 答案解释了为什么 XOR 有时工作得很好:为什么在 java hashCode() 中经常使用 XOR 而很少使用另一个位运算符?

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

a ^ b ^ a == b

换句话说,如果对哈希码有贡献的第一个和最后一个整数是相同的,那么它们根本不会对最终的哈希码有贡献——它们相互抵消,结果始终是中间整数。

如果您只使用两个整数,情况会更糟,因为:

a ^ a == 0

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

于 2013-10-02T14:31:17.347 回答
0

您可能知道 GetHashCode() 是应该将您的对象映射到数字的函数,这样两个不同对象获得相同数字的概率应该尽可能低(显然这个数字对于同一个对象应该始终相同+ 功能应该很快)。从所有布尔运算符(AND、OR、NOT、XOR)中,XOR 提供最佳位分布(查看 OR、AND、XOR 布尔表)。但是我建议你检查这种方法:What is the best algorithm for a override System.Object.GetHashCode? . (使用素数分布属性的散列函数)。

于 2013-10-02T14:32:53.953 回答