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