y también identificar idénticas geometrías.
Usted no puede confiar en hashcodes para su identificación. En el caso de una colisión de hash usted podría conseguir el mismo hashcode para diferentes objetos, por lo que siempre vas a necesitar una más costoso método de comparación post-procesamiento. Pero, por supuesto, usted puede sintonizar su hash método para reducir las colisiones de hash.
Si usted desea hacer es simple de usar MD5 o lo que sea hash, pero podría reducir la probabilidad de que un hash de colisión más. Si no se han traducido o girado geometrías y desea un entero hashcode su método podría parecerse a:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Para el geohash método también tener una mirada en un espaciales clave ('binario geohash') que es la memoria más eficiente y más precisa si los límites del área son más pequeños que los límites del mundo. Usted también puede echar un vistazo en mi implementación de Java.
Incluso se podría reducir aún más la probabilidad de una colisión de hash si usted está usando las diferencias de los puntos y calcular un 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 número entero de que podría hacer:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
O para la longitud:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)