cfisher cfisher - 3 months ago 22
Swift Question

Difference between Swift's hash and hashValue

The

Hashable
protocol in Swift requires you to implement a property called
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 }
}


However, it seems there's also a similar property called
hash
.

What is the difference between
hash
and
hashValue
?

Answer

hash is a required property in the NSObject protocol, which groups methods that are fundamental to all Objective-C objects, so that predates Swift. The default implementation just returns the objects address, as one can see in NSObject.mm, but one can override the property in NSObject subclasses.

hashValue is a required property of the Swift Hashable protocol.

Both are connected via a NSObject extension defined in the Swift standard library in 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)
}

So NSObject (and all subclasses) conform to the Hashable protocol, and the default hashValue implementation return the hash property of the object.

A similar relationship exists between the isEqual method of the NSObject protocol, and the == operator from the Equatable protocol: NSObject (and all subclasses) conform to the Equatable protocol, and the default == implementation calls the isEqual: method on the operands.

Comments