Хеширование состояния сложного объекта в .NET - PullRequest
1 голос
/ 27 марта 2010

Некоторая справочная информация:

Я работаю над приложением C # / WPF, которое в основном занимается созданием, редактированием, сохранением и загрузкой некоторой модели данных.

Модель данных содержит иерархию различных объектов.Существует «корневой» объект класса A, у которого есть список объектов класса B, у каждого из которых есть список объектов класса C и т. Д. Всего задействовано около 30 классов.

Теперь моя проблемаэто то, что я хочу подсказать пользователю с обычным "у вас есть несохраненные изменения, сохранить?"диалог, если он пытается выйти из программы.Но как мне узнать, действительно ли изменились данные в текущей загруженной модели?

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

Теперь вопрос:

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

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

Заранее спасибо.

Редактировать:

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

Ответы [ 3 ]

1 голос
/ 27 марта 2010

Хорошо, конечно, вы можете использовать рефлексию и какую-то рекурсивную функцию. Но имейте в виду, что каждый объект является моделью конкретной вещи. Я имею в виду, что там может быть много "неважных" полей и свойств.

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

И вы можете попробовать использовать классические хеш-функции, такие как SHA. Просто предположите, что ваш объект является строкой или байтовым массивом.

0 голосов
/ 27 марта 2010

Поскольку это приложение WPF, может быть проще, чем вы думаете, получать уведомления об изменениях по мере их возникновения. Архитектура событий WPF позволяет вам создавать обработчики событий на уровне где-то выше того места, где событие происходит на самом деле. Таким образом, вы можете создать обработчики событий для различных «изменений» событий ваших элементов пользовательского интерфейса в корневом окне вашего интерфейса и установить флаг «изменено» в этой области.

Обзор перенаправленных событий WPF

0 голосов
/ 27 марта 2010

Я бы посоветовал против этого. Разные объекты могут иметь одинаковый хэш. Это небезопасно полагаться на это для проверки необходимости сохранения изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...