C# HashSet определяет множество операторов множества, таких как ExceptWith (...), которые требуют сравнения элементов с другой коллекцией. Эти методы работают на основе HashCode объектов, которые они сравнивают, или они используют Equals()?Работают ли операторы набора HashSet на основе GetHashCode() или Equals()?
ответ
Все делать с хэш-кодов следует использовать как GetHashCode
и Equals
(независимо от того, называя их непосредственно на значения кандидатов или через IEqualityComparer<T>
).
Хеш-коды не гарантированно будут уникальными: они просто эффективный фильтр. Если два объекта равны, то их хэш-коды должны быть одинаковыми ... но только потому, что хэш-коды одинаковы, не означает, что они определенно равны.
Хэш-код используется для очень быстрого сужения большого набора возможных совпадений вплоть до очень небольшого набора кандидатов, которые имеют одинаковый хеш-код. (Хэш-набор запоминает как элементы, так и их хеш-коды, так что хэш-коды можно проверять, не пересчитывая их каждый раз.) Затем каждый кандидат в свою очередь должен быть проверен с помощью Equals
, чтобы определить, действительно ли это -.
Та же логика используется в HashTable
и Dictionary
, хотя потенциально с незначительными различиями в реализации. (Wikipedia article on hash tables перечисляет несколько вариантов.)
- 1. Как переопределить Equals и GetHashCode для HashSet?
- 2. C# HashSet проверяет дубликат на Equals, а затем на GetHashCode?
- 3. C# Метод HashSet Equals
- 4. Метод GetHashCode с словарем и HashSet
- 5. Equals и GetHashCode
- 6. Свойства или поля в Equals и GetHashCode?
- 7. NHibernate Equals и GetHashCode
- 8. NHibernate set: Должен ли я переопределять Equals и GetHashCode?
- 9. Словарь (TKey, TValue) GetHashCode и Equals - Как они работают?
- 10. C# перманентные альтернативы HashSet и словарь, которые не используют GetHashCode
- 11. LINQ Distinct() не работают даже реализованы Equals() и GetHashCode()
- 12. Equals и HashMap/HashSet
- 13. Коллекция EF Hashset - переопределение равных и GetHashCode
- 14. Использование метода equals() в HashSet
- 15. Почему Equals (object) выигрывает над Equals (T) при использовании унаследованного объекта в Hashset или других коллекциях?
- 16. GetHashCode и Equals реализованы неправильно в System.Attribute?
- 17. Есть ли какие-либо отрицательные последствия при использовании Equals на основе GetHashCode?
- 18. Выполнение GetHashCode() и Equals() для сохраняемых объектов
- 19. Как работают = и == операторы на основе целых чисел в Java?
- 20. Должен ли я переопределять GetHashCode и Equals в новых классах?
- 21. Метод GetHashCode для Generic HashSet <T>
- 22. GetHashCode Внедрение Equals для класса в C#
- 23. Implemeting GetHashCode и Equals методы ValueObjects
- 24. C# GetHashCode/Equals override not called
- 25. Equals, GetHashCode, EqualityComparers и нечеткое равенство
- 26. Правильный способ переопределить Equals() и GetHashCode()
- 27. Правильно Реализовать Equals и GetHashCode в подклассах
- 28. SequenceEqual in Equals делает GetHashCode сломанным
- 29. Какова лучшая стратегия для Equals и GetHashCode?
- 30. EqualityComparer <Type> GetHashCode и Equals
Оба! Объекты сравниваются сначала с помощью hashcode, а затем через 'Equals()' (если совпадают хэш-коды). – dlev
Только использование 'GetHashCode' было бы явно нарушено. «GetHashCode» имеет (практические) столкновения. Опираясь на хэш-равенство, отлично, если вы используете большой криптовый хеш (например, SHA-256), но не с 32-битным хэшем низкого качества. – CodesInChaos