为什么 ORing 两个整数被认为是一个好的哈希函数?

Why is ORing two ints considered a good hashing function?

我的一本 C# 书籍(C# 3.0 Cookbook by Hillyard and Teilhet)给出了一个 Square 的例子class 将 GetHashCode 写为

public override int GetHashCode ( ) 
{
    return this.Height.GetHashCode() | this.Width.GetHashCode();
}

我想知道为什么这被认为是一个很好的哈希码。因为 | 操作的 table 是

x | y | x OR y
--------------
0 | 0 |   0
1 | 0 |   1 
0 | 1 |   1
1 | 1 |   1

表示有3/4的时间运算结果是1。因此,如果您有杂项 ints w, x, y, z,这意味着 w | x == y | z 的可能性并不小(例如,如果使用 ^)。

我的理解是否正确?还是有充分的理由将 | 用于散列函数?

由于您提到的原因,这是一个非常糟糕的哈希函数。肯定是一个错误(或者你应该找一本新书!)。您应该将它提交到本书的勘误表页面:

http://www.oreilly.com/catalog/errata.csp?isbn=9780596516109