Почему c# hashSet принимает добавление двух объектов с одинаковым значением getHashCode ()?

У меня есть объект CustomObject, который переопределяет GetHashCode (). У меня есть HashSet, и я могу вызвать add с двумя различными объектами, имеющими один и тот же хэш-код. Оба добавляются, а позже я заканчиваю с некоторыми проблемами вставки базы данных (дубликаты первичного ключа)... Цель использования hashSet была связана с этими вставками базы данных (избегая коллизий ключей).

возможно ли, что я упускаю некоторые свойства HashSet ? Даже когда я пытаюсь проверить (.Содержит) перед добавлением (.Add), я в конечном итоге добавляю дубликаты хэш-кода...

3 ответов


, потому что HashSet<T> членство основано на равенстве объектов, а не на равенстве хэш-кода. Это совершенно законно для каждого члена HashSet<T> иметь один и тот же хэш-код, пока члены отличаются в соответствии с Equals. Роль, которую играют хэш-коды в HashSet<T> для быстрого тестирования членства. Если у вас есть объект и его хэш-код не в HashSet<T>, то вы знаете, что объект не находится в HashSet<T>. Если у вас есть объект и его хэш-код находится в HashSet<T>, тогда вы нужно пройти цепочку объектов с тем же самым тестированием хэш-кода на равенство, используя Equals чтобы увидеть, действительно ли объект находится в HashSet<T> или нет. Вот почему важно сбалансированное распределение хэш-кода. Но это не тот случай, когда уникальный хэш-коды.


переопределения GetHashCode недостаточно. Вам также нужно переопределить функцию Equals.


Do не используйте hashsets, чтобы попытаться избежать дублирования значений. Используйте их для баланса хэш-таблиц!