Два одинаковых экземпляра IPAddress IPv6 возвращают разные результаты GetHashCode

У меня есть два клиента, которые создают экземпляры IPAddress из той же byte[] и отправляют его на сервер через WCF (используя DataContractSerializer).

На сервере эти экземпляры IPAddress вставляются как ключи в словарь, но по какой-то причине они добавляются как разные ключи.

При регистрации я вижу, что они равны, но GetHashCode возвращает разные результаты.

var client1Address = // sent from client1
var client2Address = // sent from client2

Console.WriteLine(client1Address.Equals(client2Address));
Console.WriteLine(client1Address.GetHashCode().Equals(client2Address.GetHashCode()));

Вывод:

true
false

Как могут равные экземпляры IPAddress возвращать разные результаты GetHashCode?

Ответы

Ответ 1

GetHashCode реализация IPAddress для IPv6:

if (m_HashCode == 0)
{
    m_HashCode = StringComparer.InvariantCultureIgnoreCase.GetHashCode(ToString()); 
    return m_HashCode;
}

Чтобы избежать повторного вычисления хэш-кода снова и снова, они сохраняют результат в частном члене. Этот частный член затем сериализуется на удаленном сервере.

Дело в том, что StringComparer.InvariantCultureIgnoreCase.GetHashCode(ToString()) возвращает разные результаты в разных версиях ОС, и поскольку m_HashCode также сериализуется, сервер не пересчитывает его.

Это приводит к двум идентичным экземплярам IPAddress с разными результатами GetHashCode.

Я думаю, что частный член m_HashCode должен быть помечен как [NonSerialized], который заставит GetHashCode повторно генерировать хеш-код локально и правильно.

В качестве обходного пути я вмешался в процесс сериализации и сериализовался как byte[].


Здесь ошибка подключения VisualStudio. Эта ссылка мертва, поскольку ошибка была закрыта по следующим причинам:

"Благодарим вас за сообщение об этой проблеме. К сожалению, наша команда не может решить эту проблему из-за других элементов с более высоким приоритетом. Кроме того, любые изменения в сериализованном контенте типа приводят к риску взлома приложений, которые зависеть от этого поведения".