Не прямой ответ на ваш вопрос, на который Йонас ответил хорошо, однако это может помочь, если вы беспокоитесь о проверке на равенство в хешах
Из наших тестов, в зависимости от того, что вам требуется с хеш-кодами, в C # хеш-коды не обязательно должны быть уникальными для операций Equality. В качестве примера рассмотрим следующее:
У нас было требование перегрузить оператор equals, и, следовательно, функцию GetHashCode наших объектов, поскольку они стали изменчивыми и не сохраняющими состояние, и извлекали себя непосредственно из данных, поэтому в одном месте приложения нам нужно было убедиться, что объект будет рассматриваться как равный другому объекту , если он получен из тех же данных , а не только, если это была та же ссылка. Наши уникальные идентификаторы данных - Guids.
Оператор equals был прост в обслуживании, поскольку мы только что проверили Guid записи (после проверки на ноль).
К сожалению, размер данных HashCode (будучи целочисленным) зависит от операционной системы, а в нашей 32-битной системе хэш-код будет 32-битным. Математически, когда мы переопределяем функцию GetHashCode, невозможно сгенерировать уникальный хеш-код из guid, который больше 32 бит (посмотрите на это из обратного, как бы вы перевели 32-битное целое число в guid?).
Затем мы провели несколько тестов, в которых мы взяли Guid в качестве строки и вернули HashCode of Guid, который почти всегда возвращает уникальный идентификатор в наших тестах, но не всегда.
Что мы заметили, однако, когда объект находится в хешированном объекте коллекции (хеш-таблица, словарь и т. Д.), Когда 2 объекта не являются уникальными, но их хеш-коды есть, хеш-код используется только в качестве первого варианта поиска, если используются неуникальные хеш-коды, оператор равенства всегда используется в качестве отступления для определения равенства .
Как я уже сказал, это может или не может иметь отношение к вашей ситуации, но если это полезный совет.
UPDATE
Для демонстрации у нас есть Hashtable:
Ключ: объект A (хэш-код 1), значение объекта A1
Ключ: объект B (хэш-код 1), значение объекта B1
Ключ: объект C (хэш-код 1), значение объекта C1
Ключ: объект D (хэш-код 2), значение объекта D1
Ключ: объект E (хэш-код 3), значение объекта E1
Когда я вызываю хеш-таблицу для объекта с ключом Объекта A, объект A1 будет возвращен через 2 шага, вызов для хеш-кода 1, затем проверка на равенство для ключевого объекта, поскольку не существует уникального ключа с хеш-код 1
Когда я вызываю хеш-таблицу для объекта с ключом Объекта D, объект D1 будет возвращен через 1 шаг, поиск по хешу