在这篇MSDN文章 http://msdn.microsoft.com/en-us/library/ms132123.aspx中, 它讨论了Class Equalitycomparer并有一个例子.在这个关于比较它的例子中它有这个类 -
class BoxSameDimensions : EqualityComparer<Box>
{
public override bool Equals(Box b1, Box b2)
{
if (b1.Height == b2.Height & b1.Length == b2.Length
& b1.Width == b2.Width)
{
return true;
}
else
{
return false;
}
}
public override int GetHashCode(Box bx)
{
int hCode = bx.Height ^ bx.Length ^ bx.Width;
return hCode.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白行hCode = bx.Height ^ bx.Length ^ bx.Width;
有人可以解释一下吗?为什么xor?
该^
操作是按位异或运算符.
在这种情况下,它被用作从三个整数生成哈希码的便捷方式.(我不认为这是一个非常好的方式,但这是一个不同的问题......)
奇怪的是,在构造哈希代码之后,他们GetHashCode()
再次使用它,这对于int来说完全没有意义,因为它只返回int本身 - 所以它是一个无操作.
这就是他们应该写的:
public override int GetHashCode(Box bx)
{
return bx.Height ^ bx.Length ^ bx.Width;
}
Run Code Online (Sandbox Code Playgroud)
这个SO答案解释了为什么XOR有时运行得很好:为什么XOR经常在java hashCode()中使用,但很少使用其他按位运算符?
注意:我不喜欢使用xor作为三个整数的哈希码的原因是因为:
a ^ b ^ a == b
Run Code Online (Sandbox Code Playgroud)
换句话说,如果对哈希代码有贡献的第一个和最后一个int是相同的,它们根本不会对最终的哈希代码做出贡献 - 它们相互抵消,结果总是中间的int.
如果你只使用两个整数,那就更糟了,因为:
a ^ a == 0
Run Code Online (Sandbox Code Playgroud)
因此,对于两个整数,对于它们相同的所有情况,哈希码将为零.
归档时间: |
|
查看次数: |
3531 次 |
最近记录: |