GetHashCode()
не должен гарантировать уникальность (хотя это помогает для производительности, если она настолько уникальна, насколько это возможно).
Основное правило с GetHashCode()
состоит в том, что эквивалентные объекты должны иметь одинаковый хеш-код, но это не означает, что неэквивалентные объекты не могут иметь одинаковый хеш код.
Если два объекта имеют одинаковый хэш-код, то вызывается метод Equals()
, чтобы проверить, совпадают ли они. Поскольку типы различны (в зависимости от того, как вы, конечно, закодировали свою перегрузку Equals), они не будут равны, и поэтому все будет хорошо.
Даже , если у вас был различный алгоритм хеш-кода для каждого типа, всегда есть вероятность коллизии, поэтому также необходима проверка Equals()
.
Теперь, учитывая приведенный выше пример, вы не реализуете Equals()
, в результате каждый объект будет отличаться независимо от хеш-кода, поскольку реализация по умолчанию Equals()
из object
является проверкой равенства ссылок.
Если вы этого не сделали, продолжайте переопределять Equals()
для каждого из ваших типов (они могут наследовать вашу реализацию GetHashCode()
, если хотите, или есть новые), и там вы можете убедиться, что Тип объекта сравнения совпадает до объявления их равными. И убедитесь, что Equals()
и GetHashCode()
всегда реализованы так, чтобы:
- Объекты, которые
Equals()
должны , имеют одинаковые GetHashCode()
результаты.
- Объекты с разными
GetHashCode()
должны не быть Equals()
.