Ошибка в Array.IStructuralEquatable.GetHashCode?

При написании собственного неизменяемого класса 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не требует возврата случайно распределенного набора значений? После еще нескольких тестов я обнаружил, что любые два массива с одним и тем же первым элементом имеют одинаковый хэш. Я все еще думаю, что это странное поведение.

6
задан Daniel A.A. Pelsmaeker 30 July 2012 в 00:02
поделиться