Что делает метод 'hash' в Objective-C - PullRequest
6 голосов
/ 01 октября 2011

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

Я был бы очень признателен, если бы вы могли рассказать мне, что делает селектор и как его обычно используют.*

Ответы [ 2 ]

8 голосов
/ 01 октября 2011

Он вычисляет хеш объекта, что особенно полезно в HashTables, например, когда объект используется в качестве ключа для NSDictionary.

Объект hash должен иметь следующие свойства:

  • Два объекта одного класса, которые должны считаться равными, должны возвращать один и тот же хеш
  • Два объекта с разным хешем никогда не будут считаться равными
  • Два объекта с одинаковым хешем необязательно равны друг другу; в любом случае, чем более уникальным будет хеш, тем лучше будет производительность для поиска NSDictionary.
  • If также должен быть максимально быстро вычисляемым, чтобы избежать проблем с производительностью в словарях

Для получения дополнительной информации прочитайте документацию по протоколу NSObject , где определен этот метод hash.


Например, функция hash для строки может быть числом символов в этой строке или суммой кодов ascii ее символа, или чем-либо подобным.

Когда вы ищете заданный ключ в NSDictionary, одним из решений будет сравнение искомого ключа со всеми остальными ключами в словаре, который должен был бы проходить по всем ключам и вызывать isEqual для каждого ключа. и это займет много времени, если в словаре много записей. Поэтому вместо этого Cocoa вычислит хеш искомого ключа и сравнит его со всеми (предварительно вычисленными) хешами ключей в словаре.

Это гораздо эффективнее, потому что нужно будет только сравнивать значения NSUInteger, даже если ключи NSDictionary являются NSString с или другими объектами, так что это действительно быстрее. Как только он нашел ключи, которые имеют тот же хэш, что и хэш искомого ключа, он может затем пройти по всем ключам с этим хешем и сравнить их с искомым ключом, вызвав isEqual, но на этом этапе произойдет намного меньше ключей для цикла (и даже, возможно, только одного, если хеш ключа действительно уникален)

0 голосов
/ 01 октября 2011

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

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