布隆算法

上一章:bitmap说明了bitmap的的优势,可以很大程序节约空间。bitIndex通常是用hashcode。不过平常url和email等这些hashcode可能会一样,这就是大家说的哈希碰撞。这样就可能会误判。本来不是黑名单email会判断为黑名单了。

今天说下布隆算法,就是通过多组偏移量,算出多个hashcode。如果多个hashcode都存在才表示存在,一定程序上减低了误判。

  • 具体怎样映射呢?流程如下:

1.创建一个空的Bitmap集合。

2.把第一个URL按照三种Hash算法,分别生成三个不同的Hash值。

3.分别判断5,17, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把5,17,9的对应位置设置为1。

4.把第二个URL按照三种Hash算法,分别生成三个不同的Hash值。

5.分别判断10,12, 9 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把10,12, 9 的对应位置设置为1。

6.把第三个URL按照三种Hash算法,分别生成三个不同的Hash值。

7.分别判断4,16, 11 在Bitmap的对应位置是否为1,只要不同时为1,就认为该Url没有重复,于是把4,16, 11 的对应位置设置为1。

8.把第四个URL按照三种Hash算法,分别生成三个不同的Hash值。

9.分别判断5,17, 9 在Bitmap的对应位置是否为1。判断的结果是 5,17, 9 在Bitmap对应位置的值都是1,所以判定该Url是一个重复的Url

  • java 代码
private static final int DEFAULT_SIZE = 2 << 24;
private static final int[] seeds = new int[]{7, 11, 13, 31, 37, 61,};

private BitSet bits = new BitSet(DEFAULT_SIZE);
private SimpleHash[] func = new SimpleHash[seeds.length];

public static void main(String[] args) {
    String value = " 20372268@qq.com ";
    Main filter = new Main();
    System.out.println(filter.contains(value));
    filter.add(value);
    System.out.println(filter.contains(value));
}

public Main() {
    for (int i = 0; i < seeds.length; i++) {
        func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
    }
}

public void add(String value) {
    for (SimpleHash f : func) {
        bits.set(f.hash(value), true);
    }
}

public boolean contains(String value) {
    if (value == null) {
        return false;
    }
    boolean ret = true;
    for (SimpleHash f : func) {
        ret = ret && bits.get(f.hash(value));
    }
    return ret;
}

public static class SimpleHash {

    private int cap;
    private int seed;

    public SimpleHash(int cap, int seed) {
        this.cap = cap;
        this.seed = seed;
    }

    //最简单的基于seed和ascii码的Hash算法
    public int hash(String value) {
        int result = 0;
        int len = value.length();
        for (int i = 0; i < len; i++) {
            result = seed * result + value.charAt(i);
        }
        return (cap - 1) & result;
    }

}

那邮箱黑名单来说,还是有一定的概率会误判的,这时候可以再建个白名单表,把平常会误判的加入白名单。

 


注意:本文归作者所有,未经作者允许,不得转载

发布了71 篇原创文章 · 获赞 0 · 访问量 4572
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览