java - 当布隆过滤器空间不足时如何扩展布隆过滤器?

标签 java bloom-filter

我正在研究布隆过滤器算法。这个概念非常简单,下面是我用 Java 实现的“布隆过滤器结构”的简单实现。
我的问题是当bitset快满时如何扩展容量?如果我更改位集的大小,显然我必须再次考虑哈希函数,并且我必须重新排列这些现有元素。
第二个想法是初始化布隆过滤器的另一个实例。 但这只是我的想法,有人可以帮忙吗?谢谢!

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;
    }
}

最佳答案

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

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

  1. 删除当前的布隆过滤器实例
  2. 使用从 PN*2 派生的新 MH 创建新的布隆过滤器实例(或者N*3/2)
  3. 从文件中读取所有元素并将它们插入到新的布隆过滤器实例中

关于java - 当布隆过滤器空间不足时如何扩展布隆过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38579880/

相关文章:

java - 如果浏览器定向到错误的 URL,如何进行测试 "fail"

java - 从 FirebaseMessagingService 类调用 Activity 类方法

algorithm - Cuckoo Filters : Why exactly 7 counts?(如实体插入的 "limited count"所示。)

data-structures - 与布隆过滤器相反?

algorithm - 求大小为 n 的两个集合 A 和 B 之间差异的算法

java - DynamicJasper - 分组列似乎没有分组

java - BIRT 报告 - 遍历报告元素

javascript - Jsp 属性按条件禁用

java - 如何使用布隆过滤器的消息摘要获取 int 类型哈希

python - 通过从列表复制到 numpy 数组来加速 cython 循环