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