hash swift

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?