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?
Trả lời
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()
và hash2()
và tính toán [khác nhau!]: hash(s) = 2^32* hash1(s) + hash2(s)
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).
Có rất nhiều câu trả lời, hãy thử như sau:
http://stackoverflow.com/questions/415953/generate-md5-hash-in-javaEDIT: bị gỡ bỏ, tôi đã bỏ lỡ yêu cầulong
. Mea culpa.- http://en.wikipedia.org/wiki/Perfect_hash_function
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.
Mã này sẽ tính toán băm khá tốt:
String s = "some string";
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits();
- 1. Làm thế nào để tạo ra một băm md5 của một chuỗi trong RubyMotion
- 2. Làm thế nào tôi có thể khởi tạo một mảng String với độ dài 0 trong Java?
- 3. LLVM String Value objects: Làm thế nào tôi có thể lấy String từ một giá trị?
- 4. Làm thế nào tôi có thể tạo ra một Expander Stretch WPF?
- 5. Làm thế nào để tạo ra số băm của một chuỗi trong Go?
- 6. Làm thế nào tôi có thể nhận được độ dài của một mảng trong awk?
- 7. Làm cách nào tôi có thể tạo nhiều băm của một tệp chỉ bằng một lần truyền?
- 8. Làm cách nào tôi có thể khởi tạo một <IList <string>> IList?
- 9. Làm thế nào để tạo một bản sao lớp String?
- 10. Lấy chiều dài của một mảng trong một băm Perl
- 11. Làm thế nào để tạo ra một vector số có độ dài bằng không trong R
- 12. Làm thế nào tôi có thể tạo ra một ties.method mới với hàm R rank()?
- 13. Làm thế nào tôi có thể tạo ra một guid trong MFC
- 14. Làm thế nào tôi có thể tạo ra một HttpResponse giả rỗng
- 15. Làm thế nào tôi có thể xác định tên đầu ra của một StreamResult trong Struts2?
- 16. Làm thế nào để tạo một đối tượng có thể băm đúng?
- 17. Làm cách nào tôi có thể hợp nhất nhiều băm thành một băm trong Perl?
- 18. làm thế nào có thể 'originalValue.length> size' xảy ra trong hàm tạo String?
- 19. Làm thế nào tôi có thể tìm ra Javascript nào gây ra một yêu cầu Ajax?
- 20. Làm thế nào tôi có thể đưa ra một ràng buộc của DataTemplate trong WPF?
- 21. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 22. Làm thế nào tôi có thể hướng đầu ra của QProcess vào một tệp?
- 23. Làm thế nào tôi có thể kiểm tra rằng "cái gì" là một băm trong Perl?
- 24. Làm thế nào tôi có thể nhận được một băm MD5 trong Coldfusion?
- 25. Làm thế nào để tạo ra một ngày JSON.NET để String tùy chỉnh Chuyển đổi
- 26. Làm thế nào để tạo ra một String với trở về vận chuyển?
- 27. Làm thế nào để tạo một băm khóa Facebook?
- 28. Làm thế nào tôi có thể tìm thấy số lượng khóa trong một băm trong Perl?
- 29. Làm thế nào tôi có thể nhận được một ITextBuffer ra khỏi một EnvDTE.Window?
- 30. Làm thế nào để tạo một băm md5 của một chuỗi trong C?
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
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
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