布隆过滤器

布隆过滤器

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值