美文网首页
2020-11-02-数据结构与算法-13(布隆过滤器)

2020-11-02-数据结构与算法-13(布隆过滤器)

作者: 冰菓_ | 来源:发表于2020-11-14 12:38 被阅读0次

1.java代码实现布隆过滤器

import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Objects;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: tongyongtao
 * Date: 2020-11-02
 * Time: 20:37
 * java代码实现  Bloomfilter
 * 参考
 */
public class Bloomfilter {
    public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<>();
         integers.add(11111);
        System.out.println(integers.hashCode()>>>16 );

        MyBloomFilter filter = new MyBloomFilter();
        int value1 = 11111;
        int value2 = 11111;
        filter.add(value1);
        filter.add(value2);
        System.out.println(filter.contains(value1));
        System.out.println(filter.contains(value2));
    }
}


class MyBloomFilter {
    //bitset数组的大小
    private static final int DEFAULT_SIZE = 2 << 24;
    //质数集合,通过这个数组可以创建 6 个不同的哈希函数
    private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};
    //创建一个位数组
    private BitSet bitSets = new BitSet(DEFAULT_SIZE);
    //创建数组,存放包含 hash 函数的类的数组
    private SimpleHash[] simpleHashes = new SimpleHash[SEEDS.length];
    //进行初始化

    public MyBloomFilter() {
        for (int i = 0; i < simpleHashes.length; i++) {
            simpleHashes[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);
        }
    }

    //add
    public void add(Object value) {
        for (SimpleHash f : simpleHashes) {
            bitSets.set(f.hash(value), true);
        }
    }

    //判断指定元素是否存在于位数组
    public boolean contains(Object value) {
        boolean ret = true;
        for (SimpleHash f : simpleHashes) {
            //要全部满足
            ret = ret && bitSets.get(f.hash(value));
        }
        return ret;
    }

    //创建一个内部类用于计算hash值
    public static class SimpleHash {
        private int cap;
        private int seed;

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

        //一个用于计算hash的方法
        public int hash(Object value) {
            int h;
            //????
            return (value == null) ? 0 : Math.abs(seed * (cap - 1) & ((h = value.hashCode()) ^ (h >>> 16)));
        }

    }
}

2.Google开源 Guava 自带的布隆过滤器

(依赖)

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>

相关文章

网友评论

      本文标题:2020-11-02-数据结构与算法-13(布隆过滤器)

      本文链接:https://www.haomeiwen.com/subject/tfqvvktx.html