Mi forma habitual de crear un código hash para un conjunto arbitrario de elementos hashable:
int hash = 23;
hash = hash * 31 + item1Hash;
hash = hash * 31 + item2Hash;
hash = hash * 31 + item3Hash;
hash = hash * 31 + item4Hash;
hash = hash * 31 + item5Hash;
// etc
En su caso item1Hash
podría ser sólo a
y item2Hash
podría ser sólo b
.
Los valores de 23 y 31 son relativamente poco importantes, siempre y cuando sean primos (o al menos coprimidos).
Obviamente todavía habrá colisiones, pero que no se quede en los problemas desagradables normales de:
hash(a, a) == hash(b, b)
hash(a, b) == hash(b, a)
Si usted sabe más acerca de lo que los valores reales de a
y b
es probable que se pueda probablemente sea mejor, pero esta es una buena implementación inicial que es fácil de recordar e implementar. Tenga en cuenta que si hay alguna posibilidad de que construya el conjunto con "verificar derrame/subdesbordamiento aritmético", debe ponerlo todo en un bloque sin marcar. (Desbordamiento está muy bien para este algoritmo.)
http://stackoverflow.com/questions/682438/hash-function-providing-unique-uint-from-an-inate-coordinate-pair/682617#682617 –