Estoy escribiendo un programa en este momento que produce cuatro enteros sin signo de 32 bits como salida de una determinada función. Quiero analizar estos cuatro enteros, por lo que puedo comparar el resultado de esta función con los resultados futuros.Función hashing para cuatro enteros sin signo (C++)
No obstante, tengo problemas para escribir una función hash decente. Cuando originalmente escribí este código, agregué una simple suma de cada uno de los cuatro enteros, que sabía que no serían suficientes. He intentado varias otras técnicas, como cambiar y agregar, sin éxito. Obtengo un hash, pero es de mala calidad y la función genera una tonelada de colisiones.
La salida de hash puede ser un entero de 32 o 64 bits. La función en cuestión genera muchos miles de millones de hash, por lo que las colisiones son un problema real aquí, y estoy dispuesto a usar una variable más grande para asegurar que haya tan pocas colisiones como sea posible.
¿Alguien me puede ayudar a encontrar la manera de escribir una función hash de calidad?
"Estoy buscando hash estos cuatro enteros, por lo que puedo comparar el resultado de esta función con los resultados futuros". No necesariamente sigue. Si estuvieras probando una función que produce cadenas de salida, no tendrías que hacer hash a 32 o 64 bits para hacer pruebas de regresión. En su caso, se está dando un dolor de cabeza para ahorrar un 50% de espacio de almacenamiento (suponiendo que usa 64 bits en lugar de 128). ¿Vale la pena? ¿Has probado usar gzip en su lugar? –
¿Ha considerado usar una o más de las siguientes funciones hash de propósito general: http://www.partow.net/programming/hashfunctions/index.html –