Создание безопасного хэш-кода для объекта

Я импортирую некоторые данные из файла (xls, csv, xml), который приведет к сложному графу объектов в памяти. Теперь мне нужно знать, был ли этот график изменен с момента его экспорта. Что было бы безопасным способом проверить это? Полагаю, я бы экспортировал хэш-код с файлом? Если бы так было стандартный способ генерации хэш-кода объекта? Как я должен генерировать хэш? Я бы предпочел генерировать хеш на графике объекта, а не на фактическом потоке/файле.

Ответ 1

В итоге я сделал следующее (похоже, работает очень хорошо):

  • создать собственный целочисленный хэш-код, который включает все простые свойства одного объекта, используя этот алгоритм.
  • repeat 1. для всех сложных объектов, которые этот объект ссылается
  • сериализуйте весь целочисленный хэш-код в один двоичный поток в известном порядке
  • создать контрольную сумму MD5 этого потока

Ответ 2

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

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

В таких случаях я бы предпочел более сильные хеш-функции, такие как MD5 (не очень безопасный для столкновений) или лучше SHA-2. Эти работы по потокам байтов вы должны хэшировать сами данные (XML и т.д.) Или, возможно, сериализованные .net-данные (что делает хэш независимым от формата данных вашего файла)..net предоставляет классы для этих алгоритмов, см., например, http://msdn.microsoft.com/de-de/library/system.security.cryptography.hmacsha256.aspx

Ответ 3

Стандартное решение вашей проблемы - это не хеширование графика. Обычно вы просто отслеживаете, если/когда произошло изменение.

Вы можете использовать флаг HasChanged, но мне это не нравится. Обычно я использую счетчик версий, который увеличивается при каждом изменении. Затем при сохранении в файл я сохраняю текущее значение счетчика версий и проверяю, что что-то изменилось. Я сравниваю старый вариант версии с текущим.