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

C# 为什么ORing两个整数被认为是一个好的散列函数?,c#,algorithm,data-structures,hash,bit-manipulation,C#,Algorithm,Data Structures,Hash,Bit Manipulation,我的一本C#书(Hillyard和Teilhet的C#3.0烹饪书)在给出一个Square类示例时,将GetHashCode编写为 public override int GetHashCode ( ) { return this.Height.GetHashCode() | this.Width.GetHashCode(); } 我想知道为什么这被认为是一个好的哈希代码。因为|操作的表是 x | y | x OR y -------------- 0 | 0 | 0 1 | 0

我的一本C#书(Hillyard和Teilhet的C#3.0烹饪书)在给出一个
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
的可能性并没有它可能的小(例如,如果使用了
^


我对这个科雷特的理解是什么?或者有没有一个很好的理由将
|
用于散列函数?

这是一个非常糟糕的散列函数,原因正是您提到的。当然是个错误(或者你应该找一本新书!)。您应该将其提交到本书的勘误表页面:


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


这不是一个好的哈希函数<代码>^会更好。但是,请记住,
GetHashCode()
只是实现相等的第一步,因此返回一个常量也是可以接受的(但不是很好的)散列代码。@Enigmativity这是为了确认我所认为的情况欢迎这样做,希拉里:)我怀疑除了Hillyard和Teilhet之外,没有人能解释他们为什么喜欢或不喜欢XOR。我会使用后者,但是你可以对一个集合做一些基准测试,比如说
Distinct()
。我将把这个放在这里,虽然我不知道上下文,
Square
听起来好像宽度和高度应该相等。在这种情况下,XOR将是一个非常糟糕的散列组合器,因为它只能是零。它不是一个好的散列函数<代码>^会更好。但是,请记住,
GetHashCode()
只是实现相等的第一步,因此返回一个常量也是可以接受的(但不是很好的)散列代码。@Enigmativity这是为了确认我所认为的情况欢迎这样做,希拉里:)我怀疑除了Hillyard和Teilhet之外,没有人能解释他们为什么喜欢或不喜欢XOR。我会使用后者,但是你可以对一个集合做一些基准测试,比如说
Distinct()
。我将把这个放在这里,虽然我不知道上下文,
Square
听起来好像宽度和高度应该相等。在这种情况下,XOR将是一个非常糟糕的散列组合器,因为它只是零。