Alex đã giải thích nó khá tốt. Đối với những người vẫn chưa hiểu rõ về nó, hy vọng ví dụ này sẽ giúp bạn hiểu:
Giả sử tôi làm việc cho Google, trong nhóm Chrome và tôi muốn thêm một tính năng vào trình duyệt để thông báo cho người dùng nếu url anh ta đã nhập là một URL độc hại. Vì vậy, tôi có một tập dữ liệu khoảng 1 triệu URL độc hại, kích thước của tệp này là khoảng 25MB. Vì kích thước khá lớn, (lớn so với kích thước của chính trình duyệt), tôi lưu trữ dữ liệu này trên một máy chủ từ xa.
Trường hợp 1: Tôi sử dụng hàm băm với bảng băm. Tôi quyết định chọn một hàm băm hiệu quả và chạy tất cả 1 triệu url thông qua hàm băm để nhận các khóa băm. Sau đó, tôi tạo một bảng băm (một mảng), trong đó khóa băm sẽ cung cấp cho tôi chỉ mục để đặt URL đó. Vì vậy, bây giờ khi tôi đã băm và lấp đầy bảng băm, tôi kiểm tra kích thước của nó. Tôi đã lưu trữ tất cả 1 triệu URL trong bảng băm cùng với các khóa của chúng. Vì vậy, kích thước tối thiểu là 25 MB. Bảng băm này, do kích thước của nó sẽ được lưu trữ trên một máy chủ từ xa. Khi một người dùng đến và nhập một URL vào thanh địa chỉ, tôi cần kiểm tra xem nó có độc hại không. Vì vậy, tôi chạy URL thông qua hàm băm (bản thân trình duyệt có thể làm điều này) và tôi nhận được khóa băm cho URL đó. Bây giờ tôi phải đưa ra yêu cầu tới máy chủ từ xa của mình bằng khóa băm đó, để kiểm tra xem URL cụ thể trong bảng băm của tôi với khóa cụ thể đó có giống với những gì người dùng đã nhập hay không. Nếu có thì nó là độc hại và nếu không thì nó không độc. Vì vậy, mỗi khi người dùng nhập một URL, một yêu cầu tới máy chủ từ xa phải được thực hiện để kiểm tra xem đó có phải là một URL độc hại hay không. Điều này sẽ mất rất nhiều thời gian và do đó làm cho trình duyệt của tôi chậm đi.
Trường hợp 2: Tôi sử dụng bộ lọc nở. Toàn bộ danh sách 1 triệu URL được chạy qua bộ lọc bloom bằng cách sử dụng nhiều hàm băm và các vị trí tương ứng được đánh dấu là 1, trong một mảng lớn các số 0. Giả sử chúng tôi muốn tỷ lệ dương tính giả là 1%, sử dụng máy tính bộ lọc nở ( http://hur.st/bloomfilter?n=1000000&p=0.01), chúng tôi nhận được kích thước của bộ lọc nở được yêu cầu chỉ là 1,13 MB. Kích thước nhỏ này được mong đợi là, mặc dù kích thước của mảng rất lớn, chúng tôi chỉ lưu trữ các số 1 hoặc 0 chứ không phải các URL như trong trường hợp bảng băm. Mảng này có thể được coi là một mảng bit. Đó là, vì chúng ta chỉ có hai giá trị 1 và 0, chúng ta có thể đặt các bit riêng lẻ thay vì các byte. Điều này sẽ làm giảm không gian được sử dụng 8 lần. Bộ lọc bloom 1,13 MB này, do kích thước nhỏ, có thể được lưu trữ trong chính trình duyệt web !! Do đó, khi người dùng truy cập và nhập URL, chúng tôi chỉ cần áp dụng các hàm băm cần thiết (trong chính trình duyệt) và kiểm tra tất cả các vị trí trong bộ lọc bloom (được lưu trữ trong trình duyệt). Giá trị 0 ở bất kỳ vị trí nào cho chúng tôi biết rằng URL này HOÀN TOÀN KHÔNG nằm trong danh sách các URL độc hại và người dùng có thể tiếp tục tự do. Vì vậy, chúng tôi đã không thực hiện cuộc gọi đến máy chủ và do đó tiết kiệm thời gian. Giá trị 1 cho chúng ta biết rằng URL CÓ THỂ nằm trong danh sách các URL độc hại. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. Trong những trường hợp này, chúng tôi thực hiện cuộc gọi đến máy chủ từ xa và ở đó chúng tôi có thể sử dụng một số hàm băm khác với một số bảng băm như trong trường hợp đầu tiên để truy xuất và kiểm tra xem URL có thực sự tồn tại hay không. Vì hầu hết các trường hợp, một URL không có khả năng là một URL độc hại, bộ lọc nhỏ trong trình duyệt sẽ tìm ra kết quả và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. bộ lọc nhỏ trong trình duyệt hiển thị và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%. bộ lọc nhỏ trong trình duyệt hiển thị và do đó tiết kiệm thời gian bằng cách tránh các cuộc gọi đến máy chủ từ xa. Chỉ trong một số trường hợp, nếu bộ lọc bloom cho chúng tôi biết rằng URL MIGHT là độc hại, thì chỉ trong những trường hợp đó, chúng tôi mới thực hiện cuộc gọi đến máy chủ. 'MIGHT' đó đúng 99%.
Vì vậy, bằng cách sử dụng bộ lọc nở nhỏ trong trình duyệt, chúng tôi đã tiết kiệm được rất nhiều thời gian vì chúng tôi không cần thực hiện lệnh gọi máy chủ cho mỗi URL được nhập.
Chúng ta có thể thấy rằng bảng băm với một hàm băm duy nhất được sử dụng cho một mục đích khác hoàn toàn so với một bộ lọc nở. Hy vọng rằng điều này xóa nghi ngờ của bạn :)
chỉnh sửa :
Tôi đã triển khai một bộ lọc nở cho nhiệm vụ kiểm tra URL độc hại bằng Python. Bạn có thể tìm thấy mã tại đây - https://github.com/tarunsharma1/Bloom-Filter
Mã rất đơn giản để hiểu và mô tả chi tiết được cung cấp trong tệp readme.