Прочитать на английском

Поделиться через


Object.GetHashCode Метод

Определение

Служит хэш-функцией по умолчанию.

C#
public virtual int GetHashCode();

Возвращаемое значение

Хэш-код для текущего объекта.

Комментарии

Дополнительные сведения об этом API см. в разделе Дополнительные примечания API для Object.GetHashCode.

Примечания для тех, кто наследует этот метод

Хэш-функция используется для быстрого создания числа (хэш-кода), соответствующего значению объекта . Хэш-функции обычно относятся к каждому типу и для уникальности должны использовать по крайней мере одно из полей экземпляра в качестве входных данных. Хэш-коды не должны вычисляться с использованием значений статических полей.

Для классов, производных от Object, GetHashCode метод может делегировать реализацию базового класса GetHashCode() , только если производный класс определяет равенство как равенство ссылок. Реализация GetHashCode() по умолчанию для ссылочных типов возвращает хэш-код, эквивалентный тому, который возвращается методом GetHashCode(Object) . Вы можете переопределить GetHashCode() для неизменяемых ссылочных типов. Как правило, для изменяемых ссылочных типов следует переопределять GetHashCode() только в следующих случаях:

  • Хэш-код можно вычислить из полей, которые не являются изменяемыми; Или

  • Вы можете убедиться, что хэш-код изменяемого объекта не изменяется, пока объект содержится в коллекции, которая использует его хэш-код.

В противном случае можно подумать, что изменяемый объект теряется в хэш-таблице. Если вы решили переопределить GetHashCode() изменяемый ссылочный тип, в документации должно быть ясно, что пользователи вашего типа не должны изменять значения объектов, пока объект хранится в хэш-таблице.

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

Дополнительные сведения и примеры вычисления хэш-кодов различными способами см. в разделе Примеры.

Хэш-функция должна иметь следующие свойства:

  • Если два объекта сравниваются как равные GetHashCode() , метод для каждого объекта должен возвращать одно и то же значение. Однако если два объекта не сравниваются как равные GetHashCode() , методы для этих двух объектов не должны возвращать разные значения.

  • Метод GetHashCode() для объекта должен постоянно возвращать один и тот же хэш-код, если не будет изменений в состоянии объекта, определяющем возвращаемое значение метода System.Object.Equals объекта. Обратите внимание, что это верно только для текущего выполнения приложения и что при повторном запуске приложения может быть возвращен другой хэш-код.

  • Для достижения наилучшей производительности хэш-функция должна генерировать равномерное распределение для всех входных данных, включая входные данные, которые сильно кластеризованы. Подразумевается, что небольшие изменения состояния объекта должны привести к большим изменениям результирующего хэш-кода для достижения наилучшей производительности хэш-таблицы.

  • Вычисления хэш-функций должны быть недорогими.

  • Метод GetHashCode() не должен создавать исключения.

Например, реализация метода, предоставленного GetHashCode() классом , возвращает идентичные String хэш-коды для идентичных строковых значений. Таким образом, два String объекта возвращают один и тот же хэш-код, если они представляют одно и то же строковое значение. Кроме того, метод использует все символы в строке для создания разумно случайно распределенных выходных данных, даже если входные данные группируются в определенных диапазонах (например, у многих пользователей могут быть строки, содержащие только менее 128 символов ASCII, даже если строка может содержать любой из 65 535 символов Юникода).

Предоставление хорошей хэш-функции для класса может значительно повлиять на производительность добавления этих объектов в хэш-таблицу. В хэш-таблице с ключами, которые обеспечивают хорошую реализацию хэш-функции, поиск элемента занимает постоянное время (например, операция O(1). В хэш-таблице с плохой реализацией хэш-функции производительность поиска зависит от количества элементов в хэш-таблице (например, операция O(n), где n — количество элементов в хэш-таблице. Злоумышленник может вводить данные, которые увеличивают количество конфликтов, что может значительно снизить производительность приложений, зависящих от хэш-таблиц, при следующих условиях:

  • Если хэш-функции создают частые конфликты.

  • Если большая часть объектов в хэш-таблице создает хэш-коды, равные или приблизительно равные друг другу.

  • Когда пользователь вводит данные, из которых вычисляется хэш-код.

Производные классы, которые переопределяют GetHashCode() , также должны переопределяться Equals(Object) , чтобы гарантировать, что два объекта, которые считаются равными, имеют одинаковый хэш-код; в Hashtable противном случае тип может работать неправильно.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел