dies ist meine erste Frage auf diesen Foren:)Hashcode für 3D-ganzzahligen Koordinaten mit hohen räumlichen Kohärenz
Ich bin für ein räumliches Octree Voxel-System einer Koordinaten Klasse in Java zu schreiben. Diese Koordinaten sind keine Gleitpunktkoordinaten, sie sind 4D-Ganzzahlindizes in den Octree (3 normale Dimensionen X, Y, Z und ein viertes für die Tiefe in den Baum). Die ersten 3 Werte sind alle Kurzschlüsse, die letzte Dimension ist ein Byte. In der aktuellen Verwendung werden nur die ersten 11 Bits der Kurzschlüsse und nur 3 Bits des Bytes verwendet, aber dies könnte sich ändern.
Jetzt versuche ich eine 'gute' Hash-Funktion für diese Klasse zu schreiben. Das Problem, mit dem ich mich wehre, ist, dass die Koordinaten oft in räumlich hochgradig kohärenten Situationen verwendet werden (hoffe, ich verwende dort die richtige Terminologie). Was ich meine ist, dass oft eine Koordinate zusammen mit ihren unmittelbar benachbarten Nachbarn und anderen nahegelegenen Koordinaten gehashed wird.
Gibt es eine effektive Praxis, diese "nahe beieinander" -Koordinaten zu veranlassen, signifikant unterschiedliche Hashcodes zu erzeugen?
Ich löschte meine eigene ähnliche Antwort, weil sowohl Ihre Antwort als auch meine Antwort keine sehr gute Verteilung für Werte haben, die in Richtung kleinerer kurzer Werte verschoben sind. Wenn Sie eine Analyse Ihrer Funktion für x-, y-, z-Eingänge bis 256 und Tiefe bis 16 durchführen, wird Bit 24 mit der doppelten Frequenz der Bits 0..23 (die gut verteilt sind) und den Bits 25-31 nicht gesetzt überhaupt gesetzt, für jede Eingabekombination. Ich führe eine Simulation auf den vollen 2^11 Eingangsbereich durch, den das OP aus Neugier beschreibt, aber das wird ein bisschen dauern. –
@EricJ .: Aber wir brauchen hier keine einheitliche Verteilung, IMO - wir brauchen nur eine ziemlich geringe Chance auf eine Kollision. Ich denke, dass Mikers Antwort wahrscheinlich eine bessere ist, aber ich werde das für den Moment vergessen. –
Mit 25 verwendeten Bits und nur 10000 Eingängen (klein für 3D-Modell) besteht eine 77% ige Chance auf mindestens eine Kollision. Mit 100.000 Punkten ist mindestens eine Hash-Kollision praktisch gewährleistet. Geht davon aus, dass dieser Geburtstagsproblemrechner korrekt ist http://lazycackle.com/Probability_of_repeated_event_online_calculator__birthday_problem_.html –