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 тип может работать неправильно.

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

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