C# Equals and GetHashCode

本文关键字:GetHashCode and Equals | 更新日期: 2023-09-27 18:09:58

几天前我遇到了一个面试问题:为什么两个c#对象或基本类型的未覆盖的GetHashCode()方法有相同的结果,但Equals()为false?我被引导到原始类型long,无法想到一个解决方案。

C# Equals and GetHashCode

规则是如果Equals返回true,那么GetHashCode必须返回相同的值,而不是相反。

考虑一下:GetHashCode返回一个int。类型long比类型int有更多可能的值。这意味着多个长值将产生与另一个长值相同的哈希码。这就是所谓的鸽子洞原理:http://en.wikipedia.org/wiki/Pigeonhole_principle

哈希码是一个32位整数-您如何获得每个64位长度的唯一哈希?

为了尽可能高效,哈希码应该尽可能唯一。平等是一个不能被打破的数学规则。

这就是数学。鸽子洞原理指出,如果你有101只鸽子放进100个洞里,那么你必须在同一个洞里放2只鸽子。

如下所示,如果你有2^64个可能的长度,和2^32个可能的哈希码(signed int),那么你一定会得到不同长度相同的哈希码。

好吧,因为long是8字节的,int只有4字节,你可以说会有很多的哈希码冲突。

例如54294967300具有相同的哈希码。5.