In Objective-C (and other languages) a relatively good default implementation of - (NSUInteger)hash
might be:
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
Assuming both property1
and property2
return good values for hash
.
This doesn't work in Swift's equivalent var hashValue: Int
method defined on its Hashable
protocol.
The equivalent Swift code is likely to overflow and this a runtime error in Swift.
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
So my question is, what is the best technique for generating hash values (implementing Hashable) in Swift? Should I just use XOR? Though my understanding is that XOR is not ideal for creating uniform hash distributions. Perhaps something more exotic?