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

这个问题在这里已经有了答案:

  • 什么是重写的System.Object.GetHashCode的最佳算法? 17个答案
  • 什么是C#独占或`^`用法? [已关闭] 7个回答

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

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

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

    这是他们应该如何写的:

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

    这个答案解释了为什么XOR有时候工作的很好:为什么XOR经常用在java hashCode()中,但是另一个按位运算符很少被使用?

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

    a ^ b ^ a == b
    

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

    如果您仅使用两个整数,则会更糟糕,因为:

    a ^ a == 0
    

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


    正如你可能知道的那样,GetHashCode()函数应该将你的对象映射到数字中,这样两个不同对象获得相同数字的概率应该尽可能最小(显然这个数字对于同一个对象应该总是相同的+功能应该快)。 从所有布尔运算符(AND,OR,NOT,XOR)XOR提供最佳位分布(查看OR,AND,XOR布尔表)。 不过,我建议你检查这种方法:重写的System.Object.GetHashCode的最佳算法是什么? (使用素数分布属性的散列函数)。

    链接地址: http://www.djcxy.com/p/39757.html

    上一篇: Why is the xor operator used in computing hash code?

    下一篇: Custom type GetHashCode