2012-02-16 40 views
5

Tôi có một applciation java, trong đó tôi muốn tạo ra long ids cho chuỗi (để lưu trữ các chuỗi trong neo4j). Để tránh trùng lặp dữ liệu, tôi muốn tạo một id cho mỗi chuỗi được lưu trữ trong một số nguyên long, mà phải là duy nhất cho mỗi chuỗi. Làm thế nào tôi có thể làm điều đó ?Làm thế nào tôi có thể tạo ra một băm dài của một String?

+0

Bạn không thể lấy băm của các chuỗi và đưa chúng vào lâu trước khi lưu trữ trong neo? – Marthin

+5

Bạn không thể đạt được "duy nhất cho tất cả các chuỗi" - dài có 64 bit, một chuỗi có chiều dài 9 có 72 bit, có một số chuỗi sẽ được băm thành cùng một chiều dài – amit

+1

Bạn không thể nhận được tính duy nhất, vì có vô cùng nhiều chuỗi và chỉ có rất nhiều thời gian dài. Bạn có thể mô tả cụ thể hơn những gì bạn đang tìm kiếm không? – templatetypedef

Trả lời

4

long có 64 bit. A String có chiều dài 9 có 72 bit. từ pigeon hole principle - bạn không thể nhận được băm duy nhất cho 9 chuỗi ký tự dài thành long.

Nếu bạn vẫn muốn có một băm long: Bạn chỉ có thể mất hai tiêu chuẩn hàm băm cho String->int, hash1()hash2() và tính toán [khác nhau!]: hash(s) = 2^32* hash1(s) + hash2(s)

6

Tại sao bạn không có chức năng hashcode() của Chuỗi và chỉ chấp nhận nó bằng cách sử dụng giá trị dài thay thế?

Btw. nếu có một cách để tạo một ID duy nhất cho mỗi String, thì bạn sẽ tìm thấy một thuật toán nén có thể đóng gói mọi String thành 8 byte (không thể theo định nghĩa).

1

Có rất nhiều câu trả lời, hãy thử như sau:

Hoặc, như đề xuất trước đó, kiểm tra nguồn.

PS. Một kỹ thuật khác là duy trì một từ điển của chuỗi: vì bạn không thể nhận được các chuỗi 2 bất kỳ lúc nào, bạn có thể có ánh xạ hoàn hảo. Lưu ý rằng mặc dù bản đồ đó cũng có thể trở thành một nút cổ chai lớn.

5

Mã này sẽ tính toán băm khá tốt:

String s = "some string"; 
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits(); 
Các vấn đề liên quan