Мне нужно создать уникальный хэш-код для объекта, основываясь на его содержимом, например. DateTime (2011,06,04) должен равняться DateTime (2011,06,04).
- Я не могу использовать .GetHashCode(), потому что он может генерировать один и тот же хеш-код для объектов с различным содержимым.
- Я не могу использовать .GetID из ObjectIDGenerator, поскольку он генерирует другой хэш-код для объектов с тем же содержимым.
- Если объект содержит другие под-объекты, ему необходимо рекурсивно проверить их.
- Он должен работать с коллекциями.
Почему мне нужно написать это? Я пишу слой кеширования с помощью PostSharp.
Обновление
Думаю, я, возможно, задавал неправильный вопрос. Как указал Джон Скит, чтобы быть в безопасности, мне нужно столько уникальных комбинаций в ключе кеша, сколько комбинаций потенциальных данных в объекте. Поэтому лучшим решением может быть создание длинной строки, которая кодирует публичные свойства объекта, используя отражение. Объекты не слишком большие, поэтому это очень быстро и эффективно:
- Он эффективен для создания ключа кеша (просто преобразуйте общедоступные свойства объекта в большую строку).
- Эффективен для проверки попадания в кеш (сравните две строки).