Hàm băm cho dữ liệu GIS


8

Tôi muốn lấy hình học từ một tập dữ liệu vector và giảm chúng thành một hàm băm. Băm này sau đó sẽ được sử dụng để xác minh tính toàn vẹn của dữ liệu đó và cũng xác định hình học giống hệt nhau.

Có bất kỳ thuật toán thích hợp tồn tại có thể được sử dụng? Những cạm bẫy nào tôi có thể gặp phải?


4
Bạn có thể quan tâm đến bài viết của tôi về steganography vector (trong Tạp chí Chỉ đường) để biết tổng quan về một vài vấn đề liên quan đến một ứng dụng liên quan chặt chẽ, đó là ẩn các thông điệp trong dữ liệu vectơ.
whuber

Những gì mọi thứ hình học cần phải đáp ứng để được coi là bằng nhau? Nếu không có xoay vòng liên quan, bạn có thể bắt đầu bằng cách xem WKB và mở rộng nó để bạn có thể so sánh các hình học được dịch.
lynxlynxlynx

"Điều đơn giản nhất có thể có thể hoạt động" sẽ là sử dụng hàm băm tiêu chuẩn (ví dụ CRC32 hoặc MD4 nếu bạn không cần bất kỳ thuộc tính bảo mật nào hoặc SHA256 nếu bạn cần một hoặc nhiều thuộc tính bảo mật). Như lynxlynxlynx đã chỉ ra, hình học là dữ liệu dấu phẩy động, vì vậy bạn cần cẩn thận về việc so sánh "bình đẳng".
BradHards 17/03/13

Câu trả lời:


4

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)

Tôi sẽ thừa nhận tôi không phải là chuyên gia về băm, nhưng trên thực tế, mọi người thường dựa vào băm để nhận dạng - một phần vì xác suất xảy ra va chạm là rất thấp. Một phương pháp nhận dạng đắt tiền hơn sẽ cho kết quả tốt hơn, nhưng tôi nghĩ bạn cũng có thể sử dụng thuật toán băm với không gian kết quả lớn hơn (SHA1, SHA256) để hỗ trợ điều đó. Việc so sánh phức tạp hơn có trở nên đủ nhanh so với băm vào thời điểm đó hay không, tôi không biết.
nicksan

Bản thân tôi không phải là chuyên gia băm :)! và bạn thực sự đúng rằng các va chạm cho SHA-1 (và thậm chí MD5) là rất hiếm. Nhưng một lợi thế của các tính toán băm cụ thể của tôi có thể là (không được kiểm tra mặc dù!) Rằng chúng nhanh hơn để tính toán. BTW: giá trị băm int có thể được tăng lên thành một mảng dài hoặc thậm chí byte
Karussell 20/03/13

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.