为什么 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
。因此,如果您有杂项 int
s w, x, y, z
,这意味着 w | x == y | z
的可能性并不小(例如,如果使用 ^
)。
我的理解是否正确?还是有充分的理由将 |
用于散列函数?
由于您提到的原因,这是一个非常糟糕的哈希函数。肯定是一个错误(或者你应该找一本新书!)。您应该将它提交到本书的勘误表页面:
http://www.oreilly.com/catalog/errata.csp?isbn=9780596516109
我的一本 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
。因此,如果您有杂项 int
s w, x, y, z
,这意味着 w | x == y | z
的可能性并不小(例如,如果使用 ^
)。
我的理解是否正确?还是有充分的理由将 |
用于散列函数?
由于您提到的原因,这是一个非常糟糕的哈希函数。肯定是一个错误(或者你应该找一本新书!)。您应该将它提交到本书的勘误表页面:
http://www.oreilly.com/catalog/errata.csp?isbn=9780596516109