Vì vậy, điều thú vị về bộ lọc nở là để hoạt động hiệu quả, chúng cần nhiều hàm băm.
Các chuỗi Java đã có một hàm băm được tích hợp sẵn mà bạn có thể sử dụng - String.hashCode() với trả về băm số nguyên 32 bit. Đó là một mã băm OK cho hầu hết các mục đích, và có thể điều này là đủ: nếu bạn phân vùng này thành 2 mã băm 16 bit riêng biệt, ví dụ như vậy có thể đủ tốt để bộ lọc nở của bạn hoạt động. Bạn có thể sẽ nhận được một vài va chạm nhưng đó là tốt - bộ lọc nở dự kiến sẽ có một số va chạm.
Nếu không, có thể bạn sẽ muốn cuộn của riêng mình, trong trường hợp đó tôi khuyên bạn nên sử dụng String.getChars() để truy cập dữ liệu char thô, sau đó sử dụng để tính toán nhiều mã băm.
Clojure mã để giúp bạn bắt đầu (chỉ tổng giá trị ký tự):
(let [s "Hello"
n (count s)
cs (char-array n)]
(.getChars s 0 n cs 0)
(areduce cs i v 0 (+ v (int (aget cs i)))))
=> 500
Lưu ý việc sử dụng Java Clojure của interop gọi getChars, và việc sử dụng các areduce để cung cấp cho bạn một sự lặp lại rất nhanh qua mảng ký tự.
Việc triển khai bộ lọc nở hoa Java này tôi tìm thấy trên Github: https://github.com/MagnusS/Java-BloomFilter. Việc thực hiện hashcode trông OK ở cái nhìn đầu tiên nhưng nó sử dụng một mảng byte mà tôi nghĩ là một chút ít hiệu quả hơn bằng cách sử dụng ký tự vì sự cần thiết phải đối phó với các chi phí mã hóa ký tự.
gì loại dữ liệu là chìa khóa của bạn? Dây? Byte mảng? Số nguyên? UUID? – pmdj
Tôi đang thử nghiệm thành viên đối với một tập hợp các chuỗi – jdoig
Bạn có thể thử liên tục áp dụng hàm băm trộn cho giá trị băm được tích hợp được báo cáo bằng phương thức 'băm()' trên chuỗi, ví dụ: http://www.cris.com/~Ttwang/tech/inthash.htm Các giá trị được tạo có thể tương quan quá mạnh, có thể làm cho bộ lọc nở không hiệu quả. Một cách tiếp cận mà tôi đã sử dụng trong quá khứ là sử dụng hàm băm với kết quả rất dài, chẳng hạn như SHA-256 và chia kết quả thành các khối. Điều này có thể quá chậm cho mục đích của bạn. Cách đơn giản nhất có thể là tìm kiếm 'hàm băm chuỗi' của google và triển khai một vài kết quả mà nó cung cấp. – pmdj