java 标准库的 hashset 本身不支持位图压缩,无法直接作为布隆过滤器使用。要实现替代方案,需手动维护一个 bitset 实例,并配合多个哈希函数计算偏移量进行置位与查询。

如何初始化 BitSet 并配置哈希函数
通过构造函数接收期望容量和误判率,计算出位数组大小及所需哈希函数数量,并使用不同的种子生成独立的哈希映射逻辑。

import java.util.BitSet;
import java.util.Random;
public class CustomBloomFilter {
private BitSet bitSet;
private int size;
private int hashCount;
private Random random = new Random();
public CustomBloomFilter(int expectedInsertions, double fpp) {
size = optimalSize(expectedInsertions, fpp);
hashCount = optimalHashCount(size, expectedInsertions);
bitSet = new BitSet(size);
}
private int optimalSize(int n, double p) {
return (int) (-n * Math.log(p) / (Math.log(2) * Math.log(2)));
}
private int optimalHashCount(int m, int n) {
return (int) (m / n * Math.log(2));
}
public void add(String key) {
for (int i = 0; i >> 16)) * 0x85ebca6b;
result = (result ^ (result >>> 13)) * 0xc2b2ae35;
result = result ^ (result >>> 16);
return (seed * result) & Integer.MAX_VALUE;
}
}
如何处理哈希冲突与多函数映射
利用线性探测或乘积法结合不同种子值,确保同一个元素在位图中被多个不相关的索引位置标记,从而降低假阳性概率。
掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java

// 验证代码片段
CustomBloomFilter filter = new CustomBloomFilter(1000, 0.01);
filter.add("test_key");
System.out.println(filter.mightContain("test_key")); // true
System.out.println(filter.mightContain("other_key")); // false or true
基于 BitSet 内存占用的具体表现
当插入大量数据时,BitSet 的动态扩容机制会导致实际占用内存略高于理论计算值,且随着位图密度增加,查询时的误判率会呈指数级上升。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










