questa è la mia prima domanda su questi forum:)HashCode per intero coordinate 3D ad alta coerenza spaziale
Sto scrivendo una classe di coordinate in Java per un sistema octree voxel spaziale. Queste coordinate non sono coordinate in virgola mobile, sono indici interi 4D nell'occhiello (3 dimensioni normali X, Y, Z e una avanti per profondità nell'albero). I primi 3 valori sono tutti in cortocircuito, l'ultima dimensione è un byte. In questo momento vengono utilizzati solo i primi 11 bit dei cortocircuiti e solo 3 bit del byte, ma ciò potrebbe essere soggetto a modifiche.
Ora sto cercando di scrivere una funzione di hash "buona" per questa classe. Il problema con cui sto lottando è che le coordinate saranno spesso utilizzate in situazioni coerenti altamente spaziali (spero che io stia usando la terminologia giusta lì). Quello che intendo è che spesso le coordinate di una coordinata vengono troncate insieme ai suoi vicini immediatamente adiacenti e altre coordinate vicine.
Esiste una pratica efficace per far sì che queste coordinate "vicine l'una all'altra" producano codici hash significativamente differenti?
Ho eliminato la mia risposta simile perché sia la risposta che la mia risposta non hanno una distribuzione molto buona per valori asimmetrici verso valori short più piccoli. Eseguendo un'analisi sulla funzione per gli ingressi x, y, z su 256 e la profondità su 16 mostra che il bit 24 è impostato con il doppio della frequenza dei bit 0..23 (che sono ben distribuiti), ei bit 25-31 non sono impostato a tutti, per qualsiasi combinazione di input. Sto eseguendo una simulazione all'intero intervallo di input 2^11 che l'OP descrive per curiosità, ma ci vorrà un po '. –
@EricJ .: Ma non avremo davvero bisogno di una distribuzione uniforme qui, IMO - abbiamo solo bisogno di una piccola probabilità di collisione reale. Penso che la risposta di mikera sia probabilmente migliore comunque, ma lascerò tutto per il momento. –
Con 25 bit usati e solo 10000 ingressi (piccoli per modello 3D) c'è una probabilità del 77% di almeno una collisione. Con 100.000 punti, almeno una collisione hash è praticamente garantita. Suppone che questa calcolatrice del problema del compleanno sia corretta http://lazycackle.com/Probability_of_repeated_event_online_calculator__birthday_problem_.html –