在编写自己的ByteArray
在内部使用字节数组的不可变类时,我实现了IStructuralEquatable
接口。在我的实现中,我将计算哈希码的任务委托给了内部数组。在测试它时,令我大吃一惊的是,我发现我的两个不同的数组具有相同的结构哈希码,即它们从 中返回相同的值GetHashCode
。重现:
IStructuralEquatable array11 = new int[] { 1, 1 };
IStructuralEquatable array12 = new int[] { 1, 2 };
IStructuralEquatable array22 = new int[] { 2, 2 };
var comparer = EqualityComparer<int>.Default;
Console.WriteLine(array11.GetHashCode(comparer)); // 32
Console.WriteLine(array12.GetHashCode(comparer)); // 32
Console.WriteLine(array22.GetHashCode(comparer)); // 64
IStructuralEquatable
是相当新的和未知的,但我在某处读到它可以用来比较集合和数组的内容。我错了,还是我的 .Net 错了?
请注意,我不是在谈论Object.GetHashCode
!
编辑:所以,我显然错了,因为不相等的对象可能具有相等的哈希码。但是GetHashCode
返回一组随机分布的值不是必需的吗?经过更多测试后,我发现具有相同第一个元素的任何两个数组都具有相同的哈希值。我仍然认为这是一种奇怪的行为。