布隆过滤器

布隆过滤器在好多地方用的到,例如大量数据去重操作,redis中的防止击穿等。布隆过滤器的优点是占用空间少,缺点是有可能会有重复数据,所以在绝对严谨的重复判断操作情况下 简单的布隆过滤器是无法使用的,而且无法进行删除操作,因为里面保存的是hashcode码 并不是具体数据,下面将通过java实现简单的布隆过滤器

package com.jvm;

import java.util.BitSet;

public class BlooFilter {
    private static final int CAPACITY = 2 << 28;
    private BitSet bitSet = new BitSet(CAPACITY);
    private int[] coefficient = {11, 13, 17, 19, 23, 31};

    public static void main(String[] args) {
        BlooFilter blooFilter = new BlooFilter();
        String[] array = {"小刚", "丽丽", "菲菲", "命名", "小强"};
        for (String arg : array) {
            blooFilter.add(arg);
        }
        System.out.println(blooFilter.contains("丽丽"));
    }

    /**
     * 判断是否包含当前元素
     *
     * @param arg 参数
     * @return boolean
     */
    private boolean contains(String arg) {
        if (arg == null) {
            return false;
        }
        for (int cof : coefficient) {
            return bitSet.get(hash2(cof, arg));
        }
        return true;
    }

    /**
     * 向blooFilter中添加元素
     *
     * @param s 年代
     */
    private void add(String s) {
        for (int col : coefficient) {
            bitSet.set(hash2(col, s));
        }
    }

    /**
     * 容量与hashcode 并操作主要是为了不要超过容器大小,>>>无符号右移十六位 参加亦或运算。
     *
     * @param col 上校
     * @param key 关键
     * @return int
     */
    private int hash2(int col, String key) {
        int h;
        return key == null ? 0 : (col * (CAPACITY - 1) & ((h = key.hashCode()) ^ (h >>> 16)));
    }
}

但是在项目中使用的时候,并不需要自己手动写直接调用

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>21.0</version>
        </dependency>
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class TTTT {
    public static void main(String[] args) {
        BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), 2 >> 28);
        for (int i = 0; i < 10000000; i++) {
            bf.put(i);
        }
        System.out.println(bf.mightContain(50));
    }
}

完事。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值