et également identifier des géométries identiques.
Vous ne pouvez pas vous fier aux codes de hachage pour l'identification. Dans le cas d'une collision de hachage, vous pouvez obtenir le même code de hachage pour différents objets, vous aurez donc toujours besoin d'une méthode de comparaison plus coûteuse que le post-traitement. Mais bien sûr, vous pouvez ajuster votre méthode de hachage afin de réduire les collisions de hachage.
Si vous voulez simplifier, utilisez simplement MD5 ou tout autre hachage, mais vous pouvez réduire davantage la probabilité d'une collision de hachage. Si vous n'avez pas de géométries traduites ou pivotées et que vous voulez un code de hachage entier, votre méthode pourrait ressembler à ceci:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Pour la méthode geohash , jetez également un œil à une clé spatiale («binaire geohash») qui est plus efficace en mémoire et plus précise si les limites de la zone sont plus petites que les limites du monde. Vous pouvez également jeter un œil à mon implémentation Java .
Vous pouvez même réduire davantage la probabilité d'une collision de hachage si vous utilisez les différences des points et calculez un point central :
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);
}
Pour convertir par exemple la latitude en un entier, vous pouvez faire:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
Ou pour la longitude:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)