und identifizieren auch identische Geometrien.
Sie können sich bei der Identifizierung nicht auf Hashcodes verlassen. Im Falle einer Hash-Kollision können Sie denselben Hashcode für verschiedene Objekte erhalten, sodass Sie für die Nachbearbeitung immer eine teurere Vergleichsmethode benötigen. Aber natürlich können Sie Ihre Hashing-Methode optimieren, um Hash-Kollisionen zu reduzieren.
Wenn Sie es einfach machen möchten, verwenden Sie einfach MD5 oder einen anderen Hash, aber Sie können die Wahrscheinlichkeit einer Hash-Kollision weiter verringern. Wenn Sie keine übersetzten oder gedrehten Geometrien haben und einen ganzzahligen Hashcode möchten, könnte Ihre Methode folgendermaßen aussehen:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Schauen Sie sich für die Geohash- Methode auch einen räumlichen Schlüssel ('binärer Geohash') an, der speichereffizienter und präziser ist, wenn die Bereichsgrenzen kleiner als die Weltgrenzen sind. Sie können auch einen Blick in meine Java-Implementierung werfen .
Sie können die Wahrscheinlichkeit einer Hash-Kollision noch weiter verringern, wenn Sie die Unterschiede der Punkte verwenden und einen Mittelpunkt berechnen :
int hash = numberOfPoints;
hash += 37 * geometryType;
...
hash = hash XOR geohash(someCenterPoint.lat, someCenterPoint.lon);
for(point : points) {
hash += 37 * latToInteger(previousPoint.lat - point.lat);
hash += 37 * lonToInteger(previousPoint.lon - point.lon);
}
Um z. B. den Breitengrad in eine Ganzzahl umzuwandeln, können Sie Folgendes tun:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
Oder für den Längengrad:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)