布隆過濾器的實現方式

 <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>21.0</version>
    </dependency>
/**
 * Hello world!
 */
public class App {
    /**
     * 插入的數據量
     */
    private static final int insertions = 100000;
    /**
     * 誤差率
     */
    private static double fpp = 0.02;

    public static void main(String[] args) {
        //初始化一個存儲string數據的布隆過濾器,默認誤判率是0.03
        BloomFilter<String> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), insertions, fpp);
        //用於存放所有實際存在的key,用於是否存儲
        Set<String> sets = new HashSet<String>(insertions);
        //用於存放所有實際存在的key,用於取出
        List<String> lists = new ArrayList<String>(insertions);
        //插入隨機字符串
        for (int i = 0; i < insertions; i++) {
            String uuid = UUID.randomUUID().toString();
            bf.put(uuid);
            sets.add(uuid);
            lists.add(uuid);
        }
        int rightNum = 0;
        int wrongNum = 0;

        for (int i = 0; i < 10000; i++) {
            // 0-10000之間,可以被100整除的數有100個(100的倍數)
            String data = i % 100 == 0 ? lists.get(i / 100) : UUID.randomUUID().toString();

            //這裏用了might,看上去不是很自信,所以如果布隆過濾器判斷存在了,我們還要去sets中實錘
            if (bf.mightContain(data)) {
                if (sets.contains(data)) {
                    rightNum++;
                    continue;
                }
                wrongNum++;
            }
        }
        System.out.println(rightNum);
        System.out.println(wrongNum);
        BigDecimal percent = new BigDecimal(wrongNum).divide(new BigDecimal(9900), 2, RoundingMode.HALF_UP);
        BigDecimal bingo = new BigDecimal(9900 - wrongNum).divide(new BigDecimal(9900), 2, RoundingMode.HALF_UP);
        System.out.println("在100W個元素中,判斷100個實際存在的元素,布隆過濾器認爲存在的:" + rightNum);
        System.out.println("在100W個元素中,判斷9900個實際不存在的元素,誤認爲存在的:" + wrongNum + ",命中率:" + bingo + ",誤判率:" + percent);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章