Хэш-коллизии корректно обрабатываются Dictionary<>
- в том случае, если объект правильно реализует GetHashCode()
и Equals()
, соответствующий экземпляр будет возвращен из словаря.
Во-первых, вы не должны делать никаких предположений о том, как Dictionary<>
работает внутри - это детали реализации, которые могут со временем измениться. Сказав это ....
Что вас должно беспокоить, так это то, что типы, которые вы используете для ключей, правильно реализуют GetHashCode()
и Equals()
. Основные правила: GetHashCode()
должен возвращать одно и то же значение в течение срока службы объекта, и что Equals()
должно возвращать true, когда два экземпляра представляют один и тот же объект. Если вы не переопределите его, Equals()
использует равенство ссылок - это означает, что он возвращает true, только если два объекта на самом деле являются одним и тем же экземпляром. Вы можете переопределить работу Equals()
, но затем вы должны убедиться, что два «равных» объекта также выдают одинаковый хэш-код.
С точки зрения производительности вы также можете предоставить реализацию GetHashCode()
, которая генерирует хороший разброс значений для уменьшения частоты коллизий хеш-кода. Главным недостатком коллизий хеш-кода является то, что сокращает словарь в список с точки зрения производительности. Всякий раз, когда два разных экземпляра объекта выдают один и тот же хэш-код, они сохраняются в одном и том же внутреннем сегменте словаря. Результатом этого является то, что необходимо выполнить линейное сканирование, вызывая Equals()
для каждого экземпляра, пока не будет найдено совпадение.