w Objective-C (i innych języków) to stosunkowo dobry domyślny realizacja - (NSUInteger)hash
może być:Napisanie dobrego Hashable wdrożenie w Swift
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
Zakładając zarówno property1
i property2
powrotne dobre wartości dla hash
.
Nie działa to w równoważnej metodzie Swift'a var hashValue: Int
zdefiniowanej w protokole Hashable
.
Równoważny kod Swift prawdopodobnie się przepełni, a to jest błąd runtime w Swift.
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
Więc moje pytanie brzmi, jaka jest najlepsza technika do generowania wartości hash (wykonawcze Hashable) w Swift? Czy powinienem używać XOR? Chociaż rozumiem, że XOR nie jest idealny do tworzenia jednolitych dystrybucji hash. Może coś bardziej egzotycznego?
mógłby po prostu użyć operatory przepełnienia (& + i & *) umożliwiające przepełnienie liczb całkowitych w obliczeniach haszowania. https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/AdvancedOperators.html –
Dobra uwaga. Muszę dokończyć czytanie książki Swift. ;) – orj
Możesz chcieć edytować swoje pytanie. hashValue nie jest func. Zamiast tego jest to obliczona właściwość. – pohl