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


Object.GetHashCode Метод

Определение

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

public:
 virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

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

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

Комментарии

Дополнительные сведения об этом 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 противном случае тип может работать неправильно.

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

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