dan juga mengidentifikasi geometri yang identik.
Anda tidak dapat mengandalkan kode hash untuk identifikasi. Dalam kasus tabrakan hash, Anda bisa mendapatkan kode hash yang sama untuk objek yang berbeda, sehingga Anda akan selalu memerlukan metode perbandingan yang lebih mahal seperti pasca pemrosesan. Tapi tentu saja, Anda bisa menyetel metode hashing Anda untuk mengurangi tabrakan hash.
Jika Anda ingin membuatnya sederhana cukup gunakan MD5 atau apa pun hash, tetapi Anda bisa mengurangi kemungkinan tabrakan hash lebih. Jika Anda belum menerjemahkan atau memutar geometri dan Anda menginginkan kode hash integer, metode Anda akan terlihat seperti:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Untuk metode geohash juga melihat kunci spasial ('binary geohash') yang lebih hemat memori dan lebih tepat jika batas wilayah lebih kecil daripada batas dunia. Anda juga dapat melihat implementasi Java saya .
Anda bahkan dapat mengurangi kemungkinan tabrakan hash lebih lanjut jika Anda menggunakan perbedaan poin dan menghitung beberapa titik pusat :
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);
}
Untuk mengonversi mis lintang menjadi integer yang dapat Anda lakukan:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
Atau untuk garis bujur:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)