如何在空间不足时扩展bloom过滤器?

时间:2016-07-26 01:46:47

标签: java bloom-filter

我正在研究布隆过滤算法。这个概念非常简单,下面是我对" bloom过滤器结构的简单实现"在Java中。
我的问题是当bitset几乎满时如何扩展容量?如果我改变了bitset的大小,显然我必须再次考虑哈希函数,并且我必须重新安排那些存在的元素。
第二个想法是初始化另一个bloom过滤器的实例。 但这些只是我的想法,任何人都可以帮助这些?谢谢!

public class BloomFilter {

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

    static class SimpleHash {
        private int cap;
        private int seed;

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

        public int hash(String str) {
            int result = 0;
            int length = str.length();
            for (int i = 0; i < length; i++) {
                result = seed * result + str.charAt(i);
            }
            return (cap - 1) & result;
        }
    }

    private BitSet bitSet;
    private SimpleHash[] hashes;

    public BloomFilter() {
        bitSet = new BitSet(DEFAULT_SIZE);
        hashes = new SimpleHash[seeds.length];
        for (int i = 0; i < seeds.length; i++) {
            hashes[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
        }
    }

    public void add(String str) {
        for (SimpleHash hash : hashes) {
            bitSet.set(hash.hash(str), true);
        }
    }

    public boolean mightContains(String str) {
        if (str == null) {
            return false;
        }
        boolean result = true;
        for (SimpleHash hash : hashes) {
            result = result && bitSet.get(hash.hash(str));
        }

        return result;
    }
}

1 个答案:

答案 0 :(得分:2)

布隆过滤器仅在您知道要提前插入的元素数量时才有效。通常您需要误报错误P和要插入的元素数N,并使用它们来计算散列函数的数量H和容量M

如果您事先不知道元素的数量,那么唯一的方法是在将所有元素添加到bloom过滤器(例如,在文件中)时将所有元素存储在外部。当添加的元素数超过安全阈值N时,您:

  1. 删除当前的bloom过滤器实例
  2. 使用来自MH(或P
  3. 的新N*2N*3/2创建新的bloom过滤器实例
  4. 从文件中读取所有元素并将其插入新的bloom过滤器实例