使用GetHashCode测试Equals覆盖中的相等性

Arm*_*rat 9 c# gethashcode

可以调用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


ulr*_*chb 7

不,这不好,因为事实并非如此

equality <=> hashcode equality.

只是

equality => hashcode equality.

或在另一个方向:

hashcode inequality => inequality.

引用http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx:

如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.