2014-06-16 15 views
23

In Objective-C (und anderen Sprachen) sein könnte, eine relativ gute Standardimplementierung von - (NSUInteger)hash Schreiben:eine gute Hashable Implementierung in Swift

- (NSUInteger)hash { 
    return 31u * [self.property1 hash] + [self.property2 hash]; 
} 

beid property1 und property2 Rückkehr für hash gute Werte Unter der Annahme.

Dies funktioniert nicht in Swifts äquivalenter var hashValue: Int-Methode, die auf dem Hashable-Protokoll definiert ist.

Der entsprechende Swift-Code wird wahrscheinlich überlaufen und dies ist ein Laufzeitfehler in Swift.

Also meine Frage ist, was ist die beste Technik zum Generieren von Hashwerten (Hashable implementieren) in Swift? Sollte ich nur XOR benutzen? Obwohl mein Verständnis ist, dass XOR ist nicht ideal für die Erstellung von einheitlichen Hash-Verteilungen. Vielleicht etwas exotischer?

+3

Sie nicht abstürzen einfach verwenden könnte Die Überlaufoperatoren (& + und & *) erlauben Integer-Überläufe in Ihrer Hash-Berechnung. https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/AdvancedOperators.html –

+0

Guter Punkt. Ich muss das Swift-Buch zu Ende lesen. ;) – orj

+1

Vielleicht möchten Sie Ihre Frage bearbeiten. HashValue ist keine Funktion. Stattdessen ist es eine berechnete Eigenschaft. – pohl

Antwort

26

Wie von Fabian Kreiser eine vorgeschlagen können die Überlauf Operatoren die HashValue Methode, um wie folgt:

var hashValue: Int { 
    return (31 &* property1.hashValue) &+ property2.hashValue 
} 

Der Wert noch überläuft, aber zumindest ist es nicht

+7

Vielleicht möchten Sie Ihre Antwort bearbeiten. HashValue ist keine Funktion. Stattdessen ist es eine berechnete Eigenschaft. – pohl

+0

macht es einen Unterschied, welche ich als property1 oder property2 auswähle? Nehmen wir an, property1 geht von 0 bis 2, während property2 von 0 bis zu einem großen n ... – kfmfe04

+0

Dieser Ansatz verlangsamte meine Kompilierungszeit um einen Faktor von 10000. Xcode Version 8.0 (8A218a). –

Verwandte Themen