我在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命名空间中的其他类也会受到影响。
答案 0 :(得分:4)
两个不同的对象可以具有相同的哈希码。两个相等的对象alwasy具有相同的哈希码。
正如MSDN
中所述两个相等的对象返回相等的哈希码。然而, 反之则不正确:相等的哈希码并不意味着对象 相等,因为不同(不相等)的对象可以具有相同的哈希 码。此外,.NET Framework不保证默认值 执行GetHashCode方法,以及此方法的值 .NET Framework版本和平台之间的返回可能不同,例如 作为32位和64位平台。由于这些原因,请不要使用 此方法的默认实现作为唯一对象标识符 用于哈希目的。