Как контролировать, как объект хешируется хэш-набором
Вопрос
я использую HashSet<T>
хранить коллекцию объектов.Эти объекты уже имеют уникальный идентификатор System.Guid
, поэтому я бы предпочел HashSet<>
просто используйте этот существующий идентификатор, а не пытайтесь сами выяснить, как хешировать объект.Как мне переопределить встроенное хеширование и заставить мою программу использовать встроенное значение идентификатора в качестве хэш-значения?
Также скажи, что я знаю Guid
объекта в моем HashSet<>
, есть ли способ получить объект из HashSet<T>
основываясь на этом Guid
один?Или мне следует вместо этого использовать словарь.
Решение
А HashSet<>
не основан на паре ключ/значение и не обеспечивает доступа «по ключу» — это просто набор уникальных значений, использующих хэш для очень быстрой проверки содержания.
Чтобы использовать пару ключ/значение (для извлечения с помощью Guid
позже) самым простым вариантом будет Dictionary<Guid,SomeType>
.Существующий хеш-код на Guid
должно быть хорошо (хотя если тебе нужно (вам здесь нет) вы можете предоставить IEqualityComparer<T>
использовать для хеширования.
Другие советы
Переопределить GetHashCode()
метод для вашего объекта.
Здесь, конечно, есть небольшая морщинка...GUID больше, чем int32, который .NET использует для хэш-кодов.
Почему вам нужно это переопределить?кажется, возможно, преждевременной оптимизацией.
Да, просто воспользуйтесь словарем.После разработки приложения пройдите этап настройки производительности, на котором вы измеряете производительность всего вашего кода.Тогда и только тогда, когда эта хэш-функция оказывается вашей самой большой утечкой, следует ли вам рассмотреть более производительную структуру данных (если она вообще есть):-)
Попробуйте изучить System.KeyedCollection.Это позволяет вам внедрить знания о ключевом поле в реализацию вашей коллекции.