Ich möchte Geometrien aus einem Vektordatensatz nehmen und sie auf einen Hash reduzieren. Dieser Hash würde dann verwendet, um die Integrität dieser Daten zu überprüfen und auch identische Geometrien zu identifizieren.
Gibt es geeignete Algorithmen, die verwendet werden könnten? Auf welche Fallstricke könnte ich stoßen?
Antworten:
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:
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 :
Um z. B. den Breitengrad in eine Ganzzahl umzuwandeln, können Sie Folgendes tun:
Oder für den Längengrad:
quelle
In der GRASS GIS-Software verwenden wir MD5, um zu überprüfen, ob zwei Karten identisch sind:
http://svn.osgeo.org/grass/grass-addons/grass7/general/g.compare.md5/g.compare.md5.html
In Ihrem Fall muss auch die angehängte Datenbank (Attribute) überprüft werden.
quelle