y también identificar geometrías idénticas.
No puede confiar en los códigos hash para su identificación. En el caso de una colisión hash , podría obtener el mismo código hash para diferentes objetos, por lo que siempre necesitará un método de comparación más costoso como el procesamiento posterior. Pero, por supuesto, podría ajustar su método de hash para reducir las colisiones de hash.
Si desea simplificarlo, simplemente use MD5 o cualquier hash, pero podría reducir más la probabilidad de una colisión de hash. Si no tiene geometrías traducidas o rotadas y desea un código hash entero, su método podría verse así:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Para el método geohash también eche un vistazo a una clave espacial ('geohash binario') que es más eficiente en memoria y más precisa si los límites del área son más pequeños que los límites mundiales. También puedes echar un vistazo a mi implementación de Java .
Incluso podría reducir aún más la probabilidad de una colisión de hash si usa las diferencias de los puntos y calcula algún punto 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);
}
Para convertir, por ejemplo, la latitud en un entero, puede hacer:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
O por la longitud:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)