无法理解来自MSDN的哈希码相等

时间:2014-07-29 02:50:01

标签: c# hash

这是我从MSDN中找到的东西,我无法理解这句话。我非常感谢一个能够证明这一点的代码示例。

"两个相等的对象返回相等的哈希码。但是,相反的情况并非如此:相等的哈希码并不意味着对象相等,因为不同(不相等)的对象可以具有相同的哈希码。 "

取自:http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx

谢谢大家!

3 个答案:

答案 0 :(得分:8)

  

我非常感谢能够证明这一点的代码示例。

string s1 = "ꂢꂢ";
string s2 = "";
int h1 = s1.GetHashCode();
int h2 = s2.GetHashCode();
bool b1 = s1 == s2;
bool b2 = h1 == h2;

b1是假的。 b2是真的。

只有40亿个哈希码,但是有无限多的字符串。因此,它们中至少有两个必须具有相同的哈希码。我提供了其中两个;试着找到更多。

有关详细信息,请参阅:

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

http://blogs.msdn.com/b/ericlippert/archive/2011/07/12/what-curious-property-does-this-string-have.aspx

http://blogs.msdn.com/b/ericlippert/archive/2011/07/15/the-curious-property-revealed.aspx

答案 1 :(得分:7)

这可以通过应用Pigeonhole principle来解释。 GetHashCode()方法返回int,可以表示(最多)约40亿个值。在单个程序中一次可能存在超过40亿个不相等的对象(假设是64位平台!)。因此,这些对象中的两个或多个必须从GetHashCode()返回相同的值。

答案 2 :(得分:0)

同一天出生的两个人出生在同一个月。然而,情况恰恰相反:同一个月出生的两个人并不暗示他们出生在同一天,因为不同的人可以在不同的日子里过生日。