布隆过滤器
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<<bitIndex);
//把178位的状态改为0
arr[numIndex]=arr[numIndex]&(~(1<<bitIndex));
int i=178;
int bit=(arr[i/32]>>(i%32))&1;
布隆过滤器是一个大位图
失误类型:
- 黑->白X
- 白->黑V
布隆过滤器(Bloom Filter)优缺点
优点:
- 布隆过滤器在空间和时间方面都有巨大的优势,存储空间和插入/查询时间都是常数
- Hash函数之间独立,方便由硬件并行实现
- 不需要存储元素本省,对于某些保密要求非常严格的场合有优势
- 布隆过滤器可以表示全集,其他任何数据结构都不能
- k和m相同,使用同一组Hash函数的两个布隆过滤器的交并差运算可以使用位操作进行
缺点: - 存在误算率(False Positive),随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣
- 无法删除元素
Spring Boot中使用
添加redisson的Maven坐标
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-all</artifactId>
<version>3.16.0</version>
</dependency>
Java代码
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
//构造Redisson
RedissonClient redisson = Redisson.create(config);
RBloomFilter<String> 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