Какая польза от хешируемого протокола в swift4? - PullRequest
0 голосов
/ 24 августа 2018

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

Ответы [ 4 ]

0 голосов
/ 13 апреля 2019

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

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

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

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

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

Equatable протокол должен переопределить статический func == (..) , чтобыдля сравнения вашего объекта.

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

0 голосов
/ 24 августа 2018

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

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

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

0 голосов
/ 24 августа 2018

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

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

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

0 голосов
/ 24 августа 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...