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