java中使用基础类型拼出比特操作的结构(位图)
int[] arr=new int[10];//32bit*10 -> 320bits //arr[0] int 0~31 //arr[1] int 32~63 int i=178;//取出第178个bit的状态 int numIndex=178/32; int bitIndex=178%32; //取178位状态 int s=((arr[numIndex]>>bitIndex)&1); //把178位的状态改为1 arr[numIndex]=arr[numIndex]|(1<>(i%32))&1;
布隆过滤器是一个大位图
失误类型:
- 黑->白X
- 白->黑V
优点:
- 布隆过滤器在空间和时间方面都有巨大的优势,存储空间和插入/查询时间都是常数
- Hash函数之间独立,方便由硬件并行实现
- 不需要存储元素本省,对于某些保密要求非常严格的场合有优势
- 布隆过滤器可以表示全集,其他任何数据结构都不能
- k和m相同,使用同一组Hash函数的两个布隆过滤器的交并差运算可以使用位操作进行
缺点: - 存在误算率(False Positive),随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣
- 无法删除元素
添加redisson的Maven坐标
org.redisson redisson-all 3.16.0
Java代码
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
//构造Redisson
RedissonClient redisson = Redisson.create(config);
RBloomFilter bloomFilter = redisson.getBloomFilter("bloom");
//初始化布隆过滤器:预计元素为1000000L,误判率为1%
bloomFilter.tryInit(1000000L,0.01);
bloomFilter.add("1"); //增加数据
//判断指定编号是否在布隆过滤器中
System.out.println(bloomFilter.contains("1")); //输出true
System.out.println(bloomFilter.contains("8888"));//输出false



