esta es mi primera pregunta en estos foros:)Hashcode de número entero coordenadas 3D con alta coherencia espacial
estoy escribiendo una clase de coordenadas en Java para un sistema octree voxel espacial. Estas coordenadas no son coordenadas de coma flotante, son índices enteros 4D en el octárbol (3 dimensiones normales X, Y, Z y a cuarta para profundizar en el árbol). Los primeros 3 valores son todos cortos, la última dimensión es un byte. En uso real en este momento, solo se usan los primeros 11 bits de los cortos y solo 3 bits del byte, pero esto podría estar sujeto a cambios.
Ahora estoy tratando de escribir una función de hash "buena" para esta clase. El problema con el que estoy luchando es que las coordenadas a menudo se usarán en situaciones coherentes altamente espaciales (espero estar usando la terminología correcta allí). Lo que quiero decir es que muchas veces una coordenada será hashed junto con sus vecinos inmediatamente adyacentes y otras coordenadas cercanas.
¿Existe una práctica efectiva para provocar que estas coordenadas "cercanas entre sí" produzcan códigos hash significativamente diferentes?
He eliminado mi propia respuesta similar porque tanto su respuesta como mi respuesta no tienen una distribución muy buena para valores sesgados hacia valores cortos más pequeños. Al ejecutar un análisis de su función para las entradas x, y, z a 256 y la profundidad a 16, se muestra que el bit 24 está configurado con el doble de la frecuencia de los bits 0..23 (que están bien distribuidos), y los bits 25-31 no son configurado en absoluto, para cualquier combinación de entrada. Estoy ejecutando una simulación en el rango completo de entrada 2^11 que describe el OP por curiosidad, pero eso llevará un poco. –
@EricJ .: Pero realmente no necesitaremos una distribución uniforme aquí, IMO: solo necesitamos una pequeña posibilidad de colisión real. Creo que la respuesta de mikera probablemente sea mejor, de todos modos, pero dejaré esto por el momento. –
Con 25 bits usados y solo 10000 entradas (pequeña para el modelo 3D), hay un 77% de probabilidad de al menos una colisión. Con 100.000 puntos, al menos una colisión hash está prácticamente asegurada. Asume que esta calculadora de problemas de cumpleaños es correcta http://lazycackle.com/Probability_of_repeated_event_online_calculator__birthday_problem_.html –