Какая польза от хешируемого протокола в swift4?

Объясните пожалуйста использование протокола hashable с реализацией в swift. Apple определяет hashable как "тип, который предоставляет целочисленное значение хеша". Хорошо, но что такое значение хеша?

3 ответа

Решение

Чтобы объект соответствовал Hashable, нам нужно предоставить свойство hashValue, которое будет возвращать уникальное, согласованное число для каждого экземпляра. Протокол Hashable наследуется от Equatable, поэтому вам также может понадобиться реализовать функцию ==.

Примечание. Если два объекта сравниваются как равные с помощью ==, они также должны генерировать одинаковое значение хеш-функции, но обратное неверно - могут возникнуть коллизии хеш-функции.

До Swift 4.1 соответствие Hashable было сложным, потому что вам нужно было вручную вычислить свойство hashValue. В Swift 4.1 это улучшилось, так что hashValue можно было синтезировать от вашего имени, если все свойства соответствуют Hashable. В Swift 4.2 представлена ​​новая структура Hasher, которая предоставляет универсальную хэш-функцию со случайным числом элементов, облегчающую нашу жизнь. Обратитесь за более

Быстрый ответ:

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

Не быстрый ответ:

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

Когда вы используете SET, механизм под капотом использует хеш-индексы, чтобы найти объект, поэтому вам потребуется только время, чтобы рассчитать, как только искомый индекс, то вы можете получить доступ прямо к вашему объекту, ЭТО ТАК, КУХНЯ НЕ СУЩЕСТВУЕТ, Чтобы использовать SET, объект должен соответствовать протоколу Hashable начиная с Swift 4.1, если ваш класс или структура и все свойства соответствуют Hashable, то соответствие с протоколом Hashable и Equatable автоматически выполняется за вас. Если вы не соответствуете этим требованиям, вам необходимо убедиться, что вы соответствуете Equatable и Hashable протоколу.

Соответствующий протокол должен переопределить статический func ==(..) для сравнения вашего объекта.

Протокол Hashable должен предоставлять, насколько это возможно, уникальное целочисленное значение hashValue, которое должно быть одинаковым для двух объектов, когда они равны. Надеюсь это поможет

Если объект соответствует hashable протокол, он должен иметь hashValue, как вы упомянули. hashValue может использоваться для сравнения объектов / уникальной идентификации объекта.

Вы можете сравнивать объекты двумя способами:

  1. === функция. Это проверяет ссылки на объекты (может использоваться только с классами). Он проверяет, имеет ли левый объект такую ​​же ссылку на правый объект. Даже если оба объекта имеют одинаковые значения свойств, НО они имеют разные ссылки, он возвращает false.

  2. == функция (Equatable Протокол). Он проверяет, равны ли объекты друг другу на основе статической функции ==, Вы можете вернуть hashValue объекта. Таким образом, вы можете сказать, что объекты равны друг другу на основе свойств, а не ссылки.

Если вы предоставите свой собственный hashValueВы можете сказать, что объекты равны друг другу, как вы говорите, объекты равны друг другу, независимо от ссылки на объект. Вы можете использовать объекты в Set которые соответствуют протоколу hashable, потому что Set проверяет, равны ли объекты друг другу на основе hashValue,

Документация Hashable дает один конкретный пример того, для чего он:

Вы можете использовать любой тип, который соответствует протоколу Hashable в наборе или в качестве словарного ключа.

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

Другие вопросы по тегам