布隆过滤器原理(有眼睛就能看懂)
作用嘛就是用来过滤非法key,避免缓存穿透(请求直接打到数据库),布隆过滤器底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大
先贴demo后BB
public class MyBloomFilter {//后面hash函数会用到,用来生成不同的hash值,可以随便给,但别给奇数private final int[] ints = {6, 8, 16, 38, 58, 68};private Integer currentBeanCount = 0;//你的布隆过滤器容量private int DEFAULT_SIZE = Integer.MAX_VALUE;//bit数组,用来存放结果private final BitSet bitSet = new BitSet(DEFAULT_SIZE);public MyBloomFilter() {}public MyBloomFilter(int size) {if (size <= (2 << 8)) throw new RuntimeException("size is too small");DEFAULT_SIZE = size;}//获取当前过滤器的对象数量public Integer getCurrentBeanCount() {return currentBeanCount;}//计算出key的hash值,并将对应下标置为truepublic void push(Object key) {Arrays.stream(ints).forEach(i -> bitSet.set(hash(key, i)));currentBeanCount++;}//判断key是否存在,true不一定说明key存在,但是false一定说明不存在public boolean contain(Object key) {boolean result = true;for (int i : ints) {result = result && bitSet.get(hash(key, i));}return result;}//hash算法,借鉴了hashmap的算法private int hash(Object key, int i) {int h;int index = key == null ? 0 : (DEFAULT_SIZE - 1 - i) & ((h = key.hashCode()) ^ (h >>> 16));return index > 0 ? index : -index;}
}
测试
public static void main(String[] args) {MyBloomFilter bf = new MyBloomFilter ();bf.add("张学友");bf.add("郭德纲");bf.add("蔡徐鸡");bf.add(666);System.out.println(bf.contain("张学友"));//trueSystem.out.println(bf.contain("张学友 "));//falseSystem.out.println(bf.contain("张学友1"));//falseSystem.out.println(bf.contain("郭德纲"));//trueSystem.out.println(bf.contain("蔡徐老母鸡"));//falseSystem.out.println(bf.contain(666));//trueSystem.out.println(bf.contain(888));//false}
原理
通过对比hash算法计算出来的下标,注意,我们是对比一组,而不是只看一次,一次hash结果对应一个下标
把同一个key进行多次hash运算,将hash出来的下标放入数组,数组默认全为0,放入元素后该下标就为1,后面判断是否存在元素的时候也是进行同样次数的hash运算,看下结果对应的所有下标是否全为1,若全为1,则代表该key可能存在,若存在不为1的,则说明该key一定不存在;
默认位数组:[0,0,0,0,0,0]
比方说有个已知key的下标是0,2,5
对应位数组:[1,0,1,0,0,1]
判断某个未知key存不存在的时候,假设我们计算出来的下标是0,2,4
对应位数组:[1,0,1,0,1,0]
此时位数组内5对应下标值为0,而已知key位数组的5对应下标位1,说明这两个一定不是同一个key
相反,如果某个key计算出来的下标为[1,0,1,0,0,1],只能说这个key可能存在,因为这个位置可能是其它key计算出来的
如果对上面的hash算法有疑惑,请移步帮你真正理解hashCode和hash算法
demo复制可用,家里有条件的都在编译器上跑一跑,测一测
ok我话讲完
嘤嘤嘤~
布隆过滤器原理(有眼睛就能看懂)相关推荐
- 布隆过滤器原理和基于BloomFilter的误判率展示
布隆过滤器 布隆过滤器原理 布隆过滤器是由n个Hash函数和一个二进制数组组成. 如图所示(参考,hash函数可以多个) 1.保存操作 发来一个请求数据hello 对数据hello经过三次hash运算 ...
- 布隆过滤器误判怎么办为什么会_五分钟小知识:布隆过滤器原理和应用分析
布隆过滤器出现的背景和要解决的问题 Wikipedia 上面提到布隆过滤器早在 1970 年就被提出来,很难想象在当时那个年代它的主要用途是什么,估计当时提出也是一个数据模型吧. 在互联网时代,每天会 ...
- 布隆过滤器原理和使用
LSM读放大问题背景 LSM树中读放大的来源是,我们必须寻址多个磁盘驻留表,以便完成读取操作.这是因为我们不一定能预先知道一个磁盘驻留表是否包含要搜索的键指向的数据记录. LSM使用bloomfilt ...
- 布隆过滤器原理深度剖析
HBase布隆过滤器原理深度剖析 1. 数据结构与原理 1.1 初始化 1.2 变量映射 1.3 变量检索 1.4 总结 2. 过滤器特性 2.1 误判率 2.2 判断特点 3. 案列代码 1970年 ...
- 详解各种布隆过滤器原理及使用场景
文章目录 1.什么是布隆过滤器? 2.布隆过滤器的原理介绍 3.布隆过滤器使用场景 4.通过 Java 编程手动实现布隆过滤器 5.利用Google开源的 Guava中自带的布隆过滤器 6.Redis ...
- 布隆过滤器原理与golang实现
一 什么是布隆过滤器 Bloom Filters - the mathBloom Filters - the mathhttps://pages.cs.wisc.edu/~cao/papers/sum ...
- 布隆过滤器原理及在推荐业务的应用
提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里.有人说判断一个item是否在一个item列 ...
- C++ 布隆过滤器原理及实现
概念 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都 ...
- 布隆过滤器原理及实践
1 背景 现在有海量的数据,而这些数据的大小已经远远超出了服务器的内存,现在再来一条数据,如何快速高效判断这条数据在不在其中? 如果这些数据是存在数据库中的,考虑索引,分库分表:或者考虑其他目前主流的 ...
最新文章
- 物流行业如何选择手持终端
- 清单革命:为什么不仅是工具革命
- Boost:文字差异的测试程序
- 项目放到git_Git的基本使用(二)
- centos6 yum安装mysql5.6_centos 6.5 yum安装mysql 5.6
- 性能测试总结(一)---基础理论篇(转载)
- 图解算法系列笔记(三)
- jquery php 登录验证手机号码,jQuery电话号码验证实例
- C# 5.0将带来的五大新特性
- action属性注入为null
- JDK 安装 Java环境变量配置
- Grails Quartz插件,定时调度任务
- 联想计算机型号,联想笔记本所有型号介绍(经典五款推荐)
- 大点再大点个性化超大MSN头像(转)
- VS code,Live Server更改默认浏览器
- Django的模板语言DTL介绍以及渲染方式
- 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版
- 江苏省普通话水平测试计算机评分细则,江苏省计算机辅助普通话水平测试评分细则...
- 我的一点企业上云经验
- python3 + Scrapy爬虫学习之创建项目
热门文章
- 如何快速简单有效地判断一个文件是否为病毒
- android电视传屏软件下载,MAXHUB传屏助手
- oracle 分区表好处,Oracle表分区的相关概念及其优点(转)
- 2013我在奔波中走过-----------那年的高考改变了我们什么?
- 全面:一文看懂5G网络(接入网+承载网+核心网)
- flutter niu_links使用
- 【JAVA程序设计】基于JAVA/SpringBoot技术的中小型企业采购招标系统(采购员功能、企业投标功能、专家评标功能),完善的招投标流程系统
- JAVA设计模式什么鬼(中介)——作者:凸凹里歐
- nyoj 分数加减法
- 卡尔曼滤波 | Matlab实现非线性卡尔曼滤波(Nonlinear KF)