为什么ORing两个整数被认为是一个良好的散列函数?

时间:2016-03-13 06:21:07

标签: c# algorithm data-structures hash bit-manipulation

我的一本C#书籍( C#3.0 Cookbook Hillyard和Teilhet )给出了一个Square类的例子写了GetHashCode

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

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

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

这意味着操作结果的3/4时间为1。因此,如果您有其他int s w, x, y, z这意味着w | x == y | z的可能性不小(例如,如果使用^)。

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

1 个答案:

答案 0 :(得分:4)

这是一个可怕的,可怕的哈希函数,正是你提到的原因。当然是一个错误(或者你应该找一本新书!)。您应该将其提交到本书的勘误页:

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