Guava 布隆過濾器使用

Guava 布隆過濾器使用

注意

由於布隆過濾器可能存在一定的誤判,當調用 mightContain 方法時:
如果返回 true ,則此元素可能存在過濾器中,實際生產中可能需要根據具體業務進一步判斷;
如果返回 false ,則此元素一定不在過濾器中

實例

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnel;
import org.apache.commons.lang3.RandomUtils;

public class BloomFilterDemo {

    /** 預計插入的數量 */
    private static final int SIZE = 1000000;

    /**
     * 允許的錯誤率,錯誤率越低,所需內存空間就越大
     * fpp 範圍:0.0 < fpp < 1
     */
    private static final double FPP = 0.5;
    private static BloomFilter<Integer> idBloomFilter = BloomFilter.create((Funnel<Integer>) (integer, primitiveSink) -> primitiveSink.putInt(integer), SIZE, FPP);


    /**
     * 模擬初始化數據
     * 在實際生產中應該是把數據庫中的數據插入布隆過濾器
     */
    private static void initData() {
        // 實際插入預估數據量的十倍
        for (Integer i = 0; i <= SIZE * 10; i++) {
            // 遺憾的是布隆過濾器沒有 remove 方法
            idBloomFilter.put(i);
        }
    }

    static {
        initData();
    }


    public static void main(String[] args) {
        Integer fppCount = 0;
        Integer count = 100;
        
        for (int i = 0; i < count; i++) {
            Integer num = RandomUtils.nextInt(0, SIZE * 1000);

            boolean result = idBloomFilter.mightContain(num);
            
            System.out.println(num + "-----" + result);
            
            // 初始化的數據是 0 ~ SIZE,若 num > SIZE 則代表不存在過濾器中
            if ((num > SIZE && result) || (num < SIZE && !result)) {
                fppCount++;
            }
        }
        System.out.println("錯誤率:" + (fppCount / count));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章