Vector3D中出现意外的GetHashCode行为

时间:2014-07-23 22:34:39

标签: c# gethashcode

我在Vector3D类中发现了一些奇怪的行为。

给出两个Vector3Ds重新排列的X / Y / Z值(例如[0,0,1],[0,1,0]或[3,1,4],[1,3,4] ]),调用GetHashCode得到相同的值。如果您通过.Equals==检查矢量是否相等,正如预期的那样,您会看到两个矢量实际上并不相等。

如果它们不相同,为什么它们会有相同的哈希码?

var a = new System.Windows.Media.Media3D.Vector3D(0, 0, 1);
var b = new System.Windows.Media.Media3D.Vector3D(0, 1, 0);

var equal  = a == b; // false
var equals = a.Equals(b); // false
var aHashCode = a.GetHashCode(); // 1072693248
var bHashCode = b.GetHashCode(); // 1072693248
var hashEqual = a.GetHashCode() == b.GetHashCode(); // true

PS:我也在Point3D类中观察到了这种行为。也许System.Windows.Media命名空间中的其他类也会受到影响。

1 个答案:

答案 0 :(得分:4)

两个不同的对象可以具有相同的哈希码。两个相等的对象alwasy具有相同的哈希码。

正如MSDN

中所述
  

两个相等的对象返回相等的哈希码。然而,   反之则不正确:相等的哈希码并不意味着对象   相等,因为不同(不相等)的对象可以具有相同的哈希   。此外,.NET Framework不保证默认值   执行GetHashCode方法,以及此方法的值   .NET Framework版本和平台之间的返回可能不同,例如   作为32位和64位平台。由于这些原因,请不要使用   此方法的默认实现作为唯一对象标识符   用于哈希目的。