và cũng xác định hình học giống hệt nhau.
Bạn không thể dựa vào mã băm để nhận dạng. Trong trường hợp va chạm băm, bạn có thể nhận được cùng một mã băm cho các đối tượng khác nhau, vì vậy bạn sẽ luôn cần một phương pháp so sánh đắt hơn là xử lý hậu kỳ. Nhưng tất nhiên, bạn có thể điều chỉnh phương pháp băm của mình để giảm va chạm băm.
Nếu bạn muốn làm cho nó đơn giản, chỉ cần sử dụng MD5 hoặc bất kỳ hàm băm nào, nhưng bạn có thể giảm xác suất va chạm băm nhiều hơn. Nếu bạn chưa dịch hoặc xoay hình học và bạn muốn mã băm số nguyên, phương thức của bạn có thể trông như sau:
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
Đối với phương pháp geohash cũng có một cái nhìn vào khóa không gian ('geohash nhị phân') có hiệu quả bộ nhớ cao hơn và chính xác hơn nếu ranh giới khu vực nhỏ hơn ranh giới thế giới. Bạn cũng có thể xem qua triển khai Java của tôi .
Bạn thậm chí có thể giảm thêm xác suất va chạm băm nếu bạn đang sử dụng sự khác biệt của các điểm và tính toán một số điểm trung tâm :
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);
}
Để chuyển đổi, ví dụ vĩ độ thành số nguyên bạn có thể làm:
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
Hoặc cho kinh độ:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)