Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД_ответы_catsto_NEW.doc
Скачиваний:
17
Добавлен:
16.04.2019
Размер:
365.57 Кб
Скачать

System.Collections.Generic.IEqualityComparer(Of t)

Имеет два метода:

Equality - принимает два аргумента сравниваемого типа и возвращает булево значение(True - если объекты следует считать равными, и False - в ином случае). Именно в этом методе реализуется вся логика сравнения.

GetHashCode - принимает объект сравниваемого типа и возвращает соответствующее ему число типа Integer.

Со вторым методом как раз и порой и возникают проблемы. В общем-то ограничений на то, каким должно быть это число нет, но есть одно правило: если метод Equals для двух объектов возвращает True, то метод GetHashCode должен для них обоих возвращать одно и то же число, в противном случае числа должны быть разными.

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

Язык C#

public virtual int GetHashCode()

Язык Visual C++

Public:

Virtual int GetHashCode()

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

Реализация метода GetHashCode по умолчанию не гарантирует уникальность возвращаемых для объекта значений. Более того, в платформе .NET Framework не гарантируется реализация метода GetHashCode по умолчанию, а возвращаемые этим методом значения одинаковы в разных версиях .NET Framework. Следовательно, реализацию такого метода по умолчанию не следует использовать для хэширования в качестве уникального идентификатора объекта.

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

Примечания для реализующих объектов:

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

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

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

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

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

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

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