При написании собственного неизменяемого класса ByteArray
, который внутри использует массив байтов, я реализовал интерфейс IStructuralEquatable
. В моей реализации я делегировал задачу вычисления хеш-кодов внутреннему массиву. При тестировании, к моему большому удивлению, я обнаружил, что мои два разных массива имеют одинаковый структурный хэш-код , т.е. они возвращают одно и то же значение изGetHashCode
. Для воспроизведения:
IStructuralEquatable array11 = new int[] { 1, 1 };
IStructuralEquatable array12 = new int[] { 1, 2 };
IStructuralEquatable array22 = new int[] { 2, 2 };
var comparer = EqualityComparer.Default;
Console.WriteLine(array11.GetHashCode(comparer)); // 32
Console.WriteLine(array12.GetHashCode(comparer)); // 32
Console.WriteLine(array22.GetHashCode(comparer)); // 64
IStructuralEquatable
довольно новый и неизвестный, но я где-то читал, что его можно использовать для сравнения содержимого коллекций и массивов. Я ошибаюсь или мой.Net неправильный?
Обратите внимание, что я не говорю о Object.GetHashCode
!
Изменить :Итак, я, по-видимому, ошибаюсь, поскольку неравные объекты могут иметь одинаковые хэш-коды. Но разве GetHashCode
не требует возврата случайно распределенного набора значений? После еще нескольких тестов я обнаружил, что любые два массива с одним и тем же первым элементом имеют одинаковый хэш. Я все еще думаю, что это странное поведение.