Источники: - Тред на cyberforum - Откуда растут руки у GetHashCode в .NET - Habr.com - Generate Equals and GetHashCode method overrides- MSDN - Описание hash code - MSDN

Дата: 2019-10-06


GetHashCode используется для ускорения сравнения двух объектов. Если требуется узнать, одинаковы ли какие-то два объекта, то сначала сравниваются их хэш-коды. Если они различаются, то значит и объекты различны. Если же совпадают, то тогда начинается дорогостоящее “настоящее” сравнение через Equals.

Таким образом, GetHashCode должен: - совпадать для одинаковых объектов - отличаться для разных объектов - достаточно быстро вычисляться (чтобы в его использовании вообще был смысл).

Некоторые алгоритмы поиска (например, ключа в словаре), сначала сравнивают хэши, а затем, при необходимости, Equals.

Примеры реализации:

Очевидно что если у двух объектов поля i равны и поля j равны, то и i^j, то есть хэши, будут равны. С другой стороны, если хотя бы одно из полей не совпадает, то с высокой долей вероятности и i^j не будет совпадать. Плюс сравнить хэш коды быстрее, чем сравнить две пары целых. Что и требуется для хорошей хэш-функции.

В документации сказано, что если переопределяете Equals (то есть задаете свое правило сравнения объектов), то и GetHashCode надо переопределить (чтобы он новому вашему правилу соответствовал). А если не переопределяете, то и не надо GetHashCode трогать. Все объекты будут по ссылке сравниваться.

Примечание

Использоваться хэш-код может во множестве алгоритмов, в том числе и кастомных. Хэш код также используется в Hashtable - коллекции пар “ключ-значени”, где ключи упорядочены по хэш-коду.

Вывод

Иными словами, GetHashCode необходим для вычисления, эквивалентны ли два объекта или нет, и нужно ли переходить к проверке эквивалентности на основе Equals.