Chương 1 GIỚI THIỆU ĐỀ TÀI: giới thiệu về hiện trạng của ngành tài chính, cụ thể là cho vay tiêu dùng, cho vay trực tuyến và nhu cầu thực tế trong việc chia sẻ dữ liệu danh sách đen mô tả bài toán chia sẻ danh sách đen trong lĩnh vực cho vay trực tuyến. − Chương 2 CƠ SỞ KIẾN THỨC: là các cơ sở lý thuyết mà học viên sử dụng trong luận văn này, bao gồm các lý thuyết cơ bản về Bloom Filter, các thuộc tính của Bloom Filter và biến thể cải tiến khác của Bloom Filter là Counting Bloom Filter hay Mergeable Counting Bloom Filter, các hàm băm được sử dụng trong Bloom Filter, lý thuyết về Lamport Clock và Vector Clock. 7 − Chương 3 CÁC CÔNG TRÌNH NGHIÊN CỨU LIÊN QUAN: nói về các công trình nghiên cứu liên quan tới Bloom Filter. Từ đó các cải tiến của cấu trúc dữ liệu mới lần lượt ra đời, và đó cũng là cơ sở quan trọng cho ứng dụng của tác giả trong luận văn.
− Chương 4 PHƯƠNG PHÁP GIẢI QUYẾT VẤN ĐỀ: Chương 4 nói cụ thể về các mô hình đề xuất của học viên cho bài toán chia sẻ danh sách đen. − Chương 5 KẾT LUẬN: Tổng kết các đóng góp của luận văn, các vấn đề còn tồn tại của bài toán chia sẻ danh sách đen đồng thời nói về khả năng phát triển trong tương lai. 8 Chương 2 CƠ SỞ KIẾN THỨC 2. Cấu trúc dữ liệu Bloom Filter Cấu Trúc Dữ Liệu Bloom Filter là một cấu trúc dữ liệu đã nén để trả lời nhanh cho câu hỏi, phần tử này có nằm trong tập hợp không? Kết quả là có thể là “có” hoặc có thể hoặc không.
Tức là BloomFilter có thể dương tính giả (false positive) nhưng không thể có trường hợp âm tính giả (false negative). Bloom Filter bao gồm một mảng bit B có chiều dài m. Khi khởi tạo, giá trị của mỗi bit trong mảng là 0. Khi mã hoá thông tin thành viên e, e sẽ được sẽ được mã hoá bởi k hàm băm độc lập nhau:.
Vùng giá trị trả về của hàm băm sẽ là chính là chỉ mục được dùng trong mảng bit B. , sẽ được bật thành 1. Và những bit đó sẽ được gọi là bit thành viên (membership bit).1: Mã hoá các phần tử a, b,c vào Bloom Filter với số hàm băm bằng 3 2. Dương Tính Giả (False Positive) và Số Hàm Băm Tối Ưu K (Optimal K) Cho m là chiều dài của mảng bit.
n là tổng số phần tử trong tập hợp và k là tổng số hàm băm. Vậy Xác suất của 1 bit vẫn bằng 0 sau khi đã thêm vào n phần tử là: (2.1) Vậy xác suất bit đó là 1 là: (2.2) 10 Vậy một đối tượng bất kỳ, và chưa được mã hóa trong Bloom Filter , thì xác suất mà tất cả bit ở chỉ mục trả của hàm băm H của đối tượng trả về được bật là: (2.3) Trong đó là hằng số tự nhiên Euler. Rõ ràng, tỷ lệ dương tính giả sẽ giảm khi độ dài của mảng m tăng, và giảm khi số lượng phần tử n được thêm vào Bloom Filter tăng. Để tìm ra số hàm băm tối ưu, ta có thể lấy đạo hàm công thức 2.3 theo k, cho vế bên trái bằng 0 và giải phương trình.5) Khi số hàm k* được sử dụng, ta thay vào hàm tính dương tính giả công thức2.3 sẽ là fB*: (2.6) Trong đó: - là số lượng hàm băm.
- là số lượng hàm băm tối ưu. - là chiều dài của mảng bit - là tổng số phần tử đã được mã hóa trong Bloom Filter. - là hằng số tự nhiên Euler. - là tỷ lệ dương tính giả.
11 - là tỷ lệ dương tính giả khi số hàm băm tối ưu được sử dụng. Counting Bloom Filter Việc loại bỏ một phần tử trong Bloom Filter là không thể. Bởi vì mỗi bit bằng 1 sẽ được sử dụng chung bởi các phần tử khác nhau. Ta không thể đơn giản gán bit thành 0 được vì nó dẫn tới việc lược bỏ một phần tử khác.
Counting Bloom Filter dùng một mảng của bộ đếm (counter) C với chiều dài l. Mỗi bộ đếm trong mảng đều được khởi tạo là 0. Cũng giống như Bloom Filter truyền thống, chúng ta mã hoá một phần tử e bằng k hàm băm. Mỗi hàm băm sẽ trả về giá trị từ 0 tới l - 1 là chỉ mục của trong mảng bộ đếm C.
Chúng ta sẽ tăng giá trị của bộ đếm tại vị trí của số đếm lên 1.2: Mã hoá các phần tử a, b,c vào Counting Bloom Filter với số hàm băm bằng 3 Khi muốn xoá một phần tử e khỏi tập hợp, chúng ta cũng băm phần tử đó và có tập giá trị các chỉ mục. ta sẽ giảm giá trị tại các vị trí số đếm xuống 1. Khi kiểm tra một phần tử bất kỳ e’ có nằm trong Counting Bloom Filter không, ta cũng băm đối tượng thành bằng k hàm băm. Sau đó 12 kiểm tra giá trị tại các vị trí do hàm băm trả về trong mảng C có khác 0 hay không? Nếu tất cả đều khác 0, thì có thể kết luận đối tượng đó nằm trong tập hợp.
Dương Tính Giả (False Positive), Số Hàm Băm Tối Ưu (Optimal K), Kích Thước Của Bộ Đếm (Counter Size) và Độ Đếm Tràn (Counter Overflow) của Counting Bloom Filter Cho là chiều dài của mảng bộ đếm, là tổng số phần tử đã được mã hả trong Counting Bloom Filter tập hợp và là số hàm băm. Cùng phương pháp phân tích như phần 2.2, ta có xác xuất 1 phần tử trong mảng số là 0 sau khi đã thêm n phần tử là: (2.7) Vậy xác suất phần tử đó đó khác 0 là: 1- (2.8) Vậy với một đối tượng bất kỳ, và không nằm trong Counting Bloom Filter, thì xác suất mà tất cả các số ở chỉ mục được hàm băm trả về lớn hơn 0 là: (2.9) Trong đó, là hằng số Euler số tự nhiên. Từ hàm số trên, ta sẽ tính số hàm băm tối ưu k* như phương pháp ở chương 2.2 , ta lấy đạo hàm của 3.11) Trong đó là logarit cơ số tự nhiên Euler. Khi số hàm k* được sử dụng, ta thay vào hàm tính dương tính giả sẽ là fC*: (2.12) Trong đó: - là số lượng hàm băm.
- là số lượng hàm băm tối ưu. - là chiều dài của mảng bộ đếm - là tổng số phần tử đã được mã hóa trong Bloom Filter. - là hằng số tự nhiên Euler. - là tỷ lệ dương tính giả.
- là tỷ lệ dương tính giả khi số hàm băm tối ưu được sử dụng. Như vậy, Counting Bloom Filter có cùng tỷ lệ dương tính giả với Bloom Filter truyền thống. Bộ Đếm trong Counting Bloom Filter là được chỉ định trước và có giới hạn. Tất cả đều có cùng độ dài cố định.
Giả sử, mỗi bộ đếm có t bit. Giá trị của bộ đếm là từ khoảng tới. Nếu giá trị bộ đếm đang là và ta mã hoá một phần tử mới, bộ đếm sẽ tăng lên 1, tràn bộ đếm (counter overflow) sẽ xảy ra. Nếu giá trị càng nhỏ, thì việc tràn bộ đếm sẽ xảy ra thường xuyên hơn.
Tuy nhiên nếu giá trị lớn sẽ tốn bộ nhớ. Cho là một biến ngẫu nhiên là giá trị của bộ đếm sau n lần thêm phần tử vào BloomFilter, sẽ tuân theo phân phối xác suất Binomial: .13) 14 Ở đây, được xác định bởi công thức: (2.14) Xác suất để bộ đếm lớn hơn hoặc bằng giá trị y là: (2.15) Trong đó: là giai thừa giảm dần : (2. Ta có thể giới hạn bằng: (2.17) Xác suất bất kỳ bộ đếm c nào mà lớn hơn hoặc bằng y sẽ là: (2.18) Và khi số hàm băm tối ưu k* (công thức 2.11) được áp dụng thì ta có: 15 (2.19) Ý nghĩa các ký hiệu trong phần 2.4 : - là xác suất để điều kiện đó xảy ra. - là chiều dài của mảng bộ đếm.
- là giai thừa của biến x. - là hằng số tự nhiên Euler. - là logarit cơ số tự nhiên e. - là tổng số phần tử có trong Bloom Filter.
- là phép tổng. Trong thực tế, nếu tràn bộ đệm xảy ra, ta vẫn có thể giữ giá trị của bộ đếm. Nhưng qua quá nhiều phân tử, có thể dẫn tới tình huống tỷ lệ dương tính giả cao. Mergeable Counting Bloom Filter Nếu chúng ta sử dụng Bloom Filter, thì việt kết hợp hai hay nhiều vector khá đơn giản, chỉ cần OR bit tương đương trong vector.
Tuy nhiên, Counting Bloom Filter (CBF) không hỗ trợ việc kết hợp hai vectors dữ liệu do CBF không lưu thông tin về hai phần hay nhiều phần tử trùng nhau. Nếu chúng ta có 2 CBF là CBF1và CBF2. Khi hợp CBF1 và CBF2, ta sẽ cộng từng phần tử i của mảng bộ đếm CBF1 và CBF2. Nếu có quá nhiều phần tử trùng trong cả hai CBF trên thì có thể dẫn bộ đếm tràn.
Để giải quyết vấn đề này, Wengjin Liu và nhóm tác giả đã đưa ra giải pháp Mergeable Counting Bloom Filter (mergeCBF), dựa trên sử dụng thuật toán xếp lịch Cuckoo. Ý tưởng của mergeCBF là tách các mảng bộ đếm (counter array) thành một nhóm các mảng bit và sắp xếp các mảng theo một thứ tự cố định để ghi nhận những phần tử đã được thêm vào. 16 Cấu trúc của mergeCBF: - hàm băm, số lượng hàm băm tối ưu theo công thức 2. - Một nhóm gồm mảng bit , trong đó là giá trị lớn nhất của bộ đếm.
- Một mảng là orBarr, là kết quả or của nhóm các mảng bit ở trên. Dùng để tăng hiệu quả của việc truy vấn. MergeCBF không chỉ hỗ trợ delete, thêm phần tử mới, xóa phần tử mà còn hỗ trợ việc hợp giữa hai hay nhiều mergeCBF khác nhau nếu có chung hàm băm và chiều dài mảng bit. Thêm một phần tử Để thêm một phần tử vào mergeCBF, ta không chỉ băm phần tử đó bằng k hàm băm mà còn phải sắp xếp các và chọn mảng bit nào để chứa các giá trị trả về của hàm băm.
Để đảm bảo việc xếp các bit vào mảng bit một cách ít đụng độ và hiệu quả, nhóm tác giả dùng giới thiệu một thuật toán lấy ý tưởng từ thuật toán Cuckoo Hash tên là thuật toán sắp xếp virtual-Cuckoo. Ý tưởng của thuật toán Cuckoo hash là tìm ra vị trí của phần tử trong mảng, nếu vị trí ô trong mảng đã có một phần tử chiếm dụng, chúng ta sẽ đẩy phần tử đã có ra khỏi ô đó, chèn phần tử mới vào ô hiện tại, tìm một vị trí mới cho phần tử cũ. Quá trình này tiếp diễn cho tới khi không còn đụng độ nửa. Cuckoo Hash đảm bảo việc sử dụng bộ nhớ một cách hiệu quả vì nó khuyến khích nhiều ô trong mảng được sử dụng hơn.