Difference between Swift's hash and hashValue
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)
}
(For the meaning of open var
, see What is the 'open' keyword in Swift?.)
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.
![cfischer](https://i.stack.imgur.com/QH4NK.jpg?s=256&g=1)
cfischer
Updated on June 05, 2022Comments
-
cfischer about 2 years
The
Hashable
protocol in Swift requires you to implement a property calledhashValue
: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
andhashValue
?