Есть ли шанс сохранить хеш-код объекта во время его двоичной сериализации (двоичной)? - PullRequest
0 голосов
/ 31 марта 2011

Я хочу иметь возможность сравнивать объекты по хеш-коду.

В каждом примере один является самим объектом, а другой сериализуется (в двоичном виде), а затем восстанавливается версия объекта.

Как сохранить хэш в сериализованном (двоичном) объекте?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Будь осторожен!

HashCode по умолчанию для объекта .Net часто изменяется между экземплярами времени выполнения программы.

Другими словами, если ваша программа сериализует объект A, дополненный хеш-кодом, кдиск, затем программа завершается, а затем перезапускается и десериализует объект A с диска (или создает идентичный объект A во время выполнения), он будет иметь другой хеш-кодчем то, что было сохранено.

Это отчасти потому, что хеш-код по умолчанию исходит из информации сборщиков мусора об объекте.В новом экземпляре программы GC будет иметь другую информацию и, следовательно, другой хеш-код.

Если вы напишите свой собственный GetHashCode, вы можете создать хеш-код, который будет одинаковым для всех процессов.Но здесь есть ловушка, о которой вам нужно знать.

3 голосов
/ 31 марта 2011

Зачем вам нужно сериализовать хэш-код?Вместо этого вы должны обеспечить правильную реализацию GetHashCode() и Equals() в вашем объекте, которая позволяет сравнивать два объекта на основе их значений - если два объекта равны, их хеш-коды должны совпадать.Поэтому после десериализации объекта вы можете использовать GetHashCode() на нем и сравнить его с другим объектом.Обратите внимание, что того факта, что совпадение двух хеш-кодов недостаточно для определения равенства, они все равно могут отличаться - вам придется вызывать правильную реализацию Equals() для определения равенства.

Если вы просто хотите сравнитьнастраиваемые поля внутри объекта, и полное сравнение может быть слишком дорогим (т. е. большой двоичный массив). Возможно, имеет смысл сгенерировать хеш-код MD5 (т. е. с MD5CryptoServiceProvider.ComputeHash()) и сохранить его всам объект, затем он будет сериализован, как и любое другое свойство объекта.

1 голос
/ 31 марта 2011

Есть ли какая-либо информация, которую вы можете использовать, чтобы сказать, какие объекты были сериализованы и десериализованы, с каких оригиналов? Если это так, то вы можете переопределить GetHashCode () для вычисления хеш-кода на основе этой информации.

Если нет, вы можете создать его синтетически, назначив UUID каждому вновь созданному объекту. Сериализуйте это значение вместе с другими данными, чтобы у реконструированных объектов был тот же UUID. Затем вы можете просто переопределить GetHashCode (), чтобы вернуть хеш-код этого UUID. (Это должно сработать, если то, что вы ищете, является своего рода модифицированной версией ссылочного равенства.)

...