Разница между быстрым хешем и hashValue

В протоколе Hashable в Swift требуется реализовать свойство с именем hashValue:

protocol Hashable : Equatable {
    /// Returns the hash value.  The hash value is not guaranteed to be stable
    /// across different invocations of the same program.  Do not persist the hash
    /// value across program runs.
    ///
    /// The value of `hashValue` property must be consistent with the equality
    /// comparison: if two values compare equal, they must have equal hash
    /// values.
    var hashValue: Int { get }
}

Однако, похоже, существует также аналогичное свойство, называемое hash.

В чем разница между hash и hashValue?

Ответы

Ответ 1

hash является обязательным свойством в протоколе NSObject, который группирует методы, которые являются фундаментальными для всех объектов Objective-C, поэтому что предшествует Свифту. Реализация по умолчанию возвращает адрес объектов, как видно из NSObject.mm, но можно переопределить свойство в подклассах NSObject.

hashValue является обязательным свойством протокола Swift Hashable.

Оба подключаются через расширение NSObject, определенное в Быстрая стандартная библиотека в ObjectiveC.swift:

extension NSObject : Equatable, Hashable {
  /// The hash value.
  ///
  /// **Axiom:** `x == y` implies `x.hashValue == y.hashValue`
  ///
  /// - Note: the hash value is not guaranteed to be stable across
  ///   different invocations of the same program.  Do not persist the
  ///   hash value across program runs.
  open var hashValue: Int {
    return hash
  }
}

public func == (lhs: NSObject, rhs: NSObject) -> Bool {
  return lhs.isEqual(rhs)
}

(Значение open var, см. Что такое ключевое слово open в Swift?.

So NSObject (и все подклассы) соответствуют Hashable протокол и стандартная реализация hashValue верните свойство hash объекта.

Аналогичное соотношение существует между методом isEqual NSObject, а оператор == из Equatable протокол: NSObject (и все подклассы) соответствуют Equatable протокол и стандартная реализация == вызывает метод isEqual: в операндах.