美文网首页
Bloom过滤器

Bloom过滤器

作者: 有章 | 来源:发表于2018-10-17 08:50 被阅读0次
    1.生成8个随机数,最好为质数
    2.将value添加到BitSet中,分别使用8个随机数作为seed,对value进行hash后的result,
    然后BitSet.add(Bitset.size&result,true)
    3.判断一个othValue是否在bloom中,同样的逻辑,将othValue与以8个质数为seed进行hash,
    得到Bitset.size&result,判断8个结果是否都在bloom中,
    如果全在,则表示存在。误报率千万分之一
    
    代码实现:
    public class BloomFilter {
        int[] seeds = new int[]{3, 5, 7, 11, 13, 31, 37, 61};
        Hash[] funcs = new Hash[seeds.length];
    
        int length = 2 << 28;
        BitSet bitSet = new BitSet(length);
    
        public BloomFilter() {
            for (int i = 0; i < funcs.length; i++) {
                funcs[i] = new Hash(length, seeds[i]);
            }
        }
    
        public void addValue(String value) {
            for (Hash fun : funcs) {
                bitSet.set(fun.hash(value), true);
            }
        }
    
        public static void main(String[] args) {
            BloomFilter filter = new BloomFilter();
            filter.addValue("www.baidu.com");
            filter.addValue("www.sohu.com");
            System.out.println(filter.contains("www.baidu.com"));
            System.out.println(filter.contains("www.sina.com"));
        }
    
        private boolean contains(String value) {
            boolean result = true;
            for (Hash fun : funcs) {
                if (result)
                    result = result & bitSet.get(fun.hash(value));
            }
            return result;
        }
    }
    
    public class Hash {
        int size;
        int seed;
    
        public Hash(int size, int seed) {
            this.size = size;
            this.seed = seed;
        }
    
        public int hash(String value) {
            int len = value.length();
            int result = 0;
            for (int i = 0; i < len; i++) {
                result = result * seed + value.charAt(i);
            }
            return (size - 1) & result;
        }
    }
    

    相关文章

      网友评论

          本文标题:Bloom过滤器

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