e também identificar geometrias idênticas.
Você não pode confiar em códigos de hash para identificação. No caso de uma colisão de hash, você pode obter o mesmo código de hash para objetos diferentes; portanto, você sempre precisará de um método de comparação mais caro que o pós-processamento. Mas é claro, você pode ajustar seu método de hash para reduzir colisões de hash.
Se você quiser simplificar, use o MD5 ou qualquer hash, mas poderá reduzir ainda mais a probabilidade de uma colisão de hash. Se você não possui geometrias traduzidas ou rotacionadas e deseja um código de hash inteiro, seu método pode se parecer com:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Para o método geohash , observe também uma chave espacial ('binário geohash') que é mais eficiente em termos de memória e mais precisa se os limites da área forem menores que os limites do mundo. Você também pode dar uma olhada na minha implementação Java .
Você pode reduzir ainda mais a probabilidade de uma colisão de hash se estiver usando as diferenças dos pontos e calcular algum ponto 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 converter, por exemplo, a latitude em um número inteiro, você pode:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
Ou para a longitude:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)