可以调用GetHashCode作为从Equals覆盖内部测试相等性的方法吗?
例如,这段代码可以接受吗?
public class Class1
{
public string A
{
get;
set;
}
public string B
{
get;
set;
}
public override bool Equals(object obj)
{
Class1 other = obj as Class1;
return other != null && other.GetHashCode() == this.GetHashCode();
}
public override int GetHashCode()
{
int result = 0;
result = (result ^ 397) ^ (A == null ? 0 : A.GetHashCode());
result = (result ^ 397) ^ (B == null ? 0 : B.GetHashCode());
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 14
其他人是对的; 你的平等操作被打破了.为了显示:
public static void Main()
{
var c1 = new Class1() { A = "apahaa", B = null };
var c2 = new Class1() { A = "abacaz", B = null };
Console.WriteLine(c1.Equals(c2));
}
Run Code Online (Sandbox Code Playgroud)
我想你想要那个程序的输出是"假的",但是你对CLR的某些实现的相等定义是"真的".
请记住,只有大约40亿个可能的哈希码.有超过40亿个可能的六个字母字符串,因此其中至少有两个具有相同的哈希码.我给你看了两个; 还有更多的东西.
一般来说,如果有n个可能的哈希码,那么一旦你了解了n个元素的平方根,那么获得冲突的几率会急剧上升.这就是所谓的"生日悖论".关于为什么不应该依赖哈希码来实现相等性的文章,请参阅:
http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx
不,这不好,因为事实并非如此
equality <=> hashcode equality.
这只是
equality => hashcode equality.
或在另一个方向:
hashcode inequality => inequality.
引用http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx:
如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.
| 归档时间: |
|
| 查看次数: |
3073 次 |
| 最近记录: |