Escribir una buena implementación Hashable en Swift
(1)
Según lo sugerido por Fabian Kreiser, uno puede usar los operadores de desbordamiento para hacer el método hashValue de la siguiente manera:
var hashValue: Int {
return (31 &* property1.hashValue) &+ property2.hashValue
}
El valor aún se desborda, pero al menos no se cuelga
En Objective-C (y en otros lenguajes), una implementación predeterminada relativamente buena de - (NSUInteger)hash
podría ser:
- (NSUInteger)hash {
return 31u * [self.property1 hash] + [self.property2 hash];
}
Suponiendo que tanto property1
como property2
devuelven buenos valores para hash
.
Esto no funciona en el var hashValue: Int
equivalente de var hashValue: Int
método var hashValue: Int
definido en su protocolo Hashable
.
Es probable que se desborde el código Swift equivalente y este es un error de tiempo de ejecución en Swift.
var hashValue: Int {
return 31 * property1.hashValue + property2.hashValue // overflow-tastic
}
Entonces mi pregunta es, ¿cuál es la mejor técnica para generar valores hash (implementando Hashable) en Swift? ¿Debería usar XOR? Aunque tengo entendido que XOR no es ideal para crear distribuciones hash uniformes. Quizás algo más exótico?