布隆过滤器

2025/10/28 Utils
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.apache.commons.io.Charsets;

import java.util.ArrayList;
import java.util.List;

/**
 * 布隆过滤器
 *
 * @author:saltedFish
 * @create:2024-12-02 14:15
 */
public class MultiBloomFilter {

    private List<BloomFilter<String>> bloomFilters;
    private int currentFilterIndex;
    private int maxElementsPerFilter;
    private double fpp;

    public MultiBloomFilter(int initialCapacity, double fpp) {
        this.maxElementsPerFilter = initialCapacity;
        this.fpp = fpp;
        this.bloomFilters = new ArrayList<>();
        this.currentFilterIndex = 0;
        addNewFilter();
    }

    private void addNewFilter() {
        BloomFilter<String> newFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), maxElementsPerFilter, fpp);
        bloomFilters.add(newFilter);
    }

    public synchronized boolean mightContain(String key) {
        for (BloomFilter<String> filter : bloomFilters) {
            if (filter.mightContain(key)) {
                return true;
            }
        }
        return false;
    }

    public synchronized void put(String key) {
        BloomFilter<String> currentFilter = bloomFilters.get(currentFilterIndex);
        if (currentFilter.approximateElementCount() >= maxElementsPerFilter) {
            addNewFilter();
            currentFilterIndex++;
            currentFilter = bloomFilters.get(currentFilterIndex);
        }
        currentFilter.put(key);
    }

    /**
     * 清空布隆过滤器实例和列表
     */
    public synchronized void clear() {
        // 显式清空布隆过滤器实例
        for (BloomFilter<String> filter : bloomFilters) {
            // 显式置为 null
            filter = null;
        }
        // 清空列表
        bloomFilters.clear();
        // 重置当前过滤器索引
        currentFilterIndex = 0;
        // 添加新的布隆过滤器
        addNewFilter();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69