也来分析BloomFilter
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://izualzhy.cn/bloom-filter-paper
参考:https://izualzhy.cn/leveldb-bloom-filter
参考:https://www.lmlphp.com/user/56/article/item/1170/
参考:https://en.wikipedia.org/wiki/Bloom_filter
引言
BloomFilter是在1970由Burton Howard Bloom发表。也因此,方法名上带了Burton Bloom先生的名字Bloom,通常我们称为这个方法布隆过滤器。
A Bloom filter is a space-efficient probabilistic data structure, conceived by Burton Howard Bloom in 1970, that is used to test whether an element is a member of a set.
概率分析方法总是那么的令人意想不到,同时也让人赞不绝口。BloomFilter也是如此,作为概率分析方法,它同样的利用离散随机与概率,从而来提供一个高效的数据查询检测。
以BloomFilter推荐的10bits存储来说,通过存储到10bits*key个数的空间里的比特位设置,提供了约很高的概率来识别key是否在范围内:如果识别在范围内,则有约99%的概率识别准确,如果识别不在范围内,则100%不在范围内。
使用过程
使用BloomFilter时,一般分为两个过程:一个是记录过程,把所有keys记录离散记录到一段filter存储空间内;一个查询过程,把key离散,查询filter空间内是否有记录。
Fiter记录时:
BloomFiter把所有的keys进行hash运算后,对内存块的运算出的位进行位填充;
之后把填充的位作为filter识别串记录下来,这段内存块隐含了keys的信息;
并且所设的位数小于每个key分配的bits位数,保证了空间的富裕,有许多未设的bits。
识别key是否filter范围时:
对key进行同样的hash运算,然后对算出的位检查是否有位填充;
如果所有hash计算位都被填充,则认为有较大可能性包含;
如果有hash计算位未被填充,则key肯定不在范围内;
简析
从本质上来开,这依然是一个概率游戏,赌随机性。
分配的位数比较多一些,最大的填充位数少于总分配位数,从而让识别时,每次有较大的概率识别到未被设置的位,从而让随机数字的识别通过率较低,也就保证了有较大概率让不在范围的key及时识别出不在范围的结果。
例如当使用10bits时,每个key最大填充使用6个bits。
如果hash足够的随机,则对于一个任意数字,每次做位选取识别时,有小于60%的概率识别到填充位,大于40%的概率识别到非填充位;进行6次位选识别,则每次概率都是40%概率被识别出局,则识别出局概率也多达1.0-pow(0.4, 6)。
BloomFilter的probes探针数量为6时:
- 向filter放入key值时:
一个key通过hash运算,产生6个探针,也就是会对6bit值进行设为为1;
在空间的这6个探针位置的bit值置位1; - 查询key值是否存在时:
一个key通过hash运算,产生6个探针,也就是会对6bit值进行判断;
检查空间的6bits,检查该位置是否被置位,从而判定该值是否存在;
推算
下面继续以10bits来演算一下概率:
1.推算1
假设hash足够随机,每个可以都能设置不重复的6bit,如果key之间完全不重复的话60%比特位置位为1;
查询时,对于任意一个key,从概率上来看:
每次命中1的比率为60%,6次都命中概率为Math.pow(0.6, 6)=0.046656,准确率约为95.4%。
2.推算2
每个key置6bit,考虑key之间可能会产生重复置位情况的话,如果设置位比分比为50%,50%的比特被置位为1;
查询时,对于任意一个key,从概率上来看:
每次命中1的比率为60%,6次都命中概率为Math.pow(0.5, 6)=0.015625,准确率约为98.5%。
官方给出采用BloomFilterPolicy采用10bits时,正确率达到99%;
基于这个做初步判定的话,10bits时,bit填充为1的比率大概在50%左右;
3.一个验证测试
使用8字节keys,存储约164个有序的keys,每个key10bits,164*10/8=205,长度205。
统计其中一个filter,置位为1的个数有约739,填充率约为45%,以此计算随机数的命中概率的话为0.83%,这个也就是准确率约为99.2%。
filter: offset-0, length-205(bytes), setBits-739, percent=0.451
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
也来分析BloomFilter相关推荐
- 【RuoYi-Vue-Plus】学习笔记 46 - Redisson(十二)布隆过滤器 BloomFilter 简单分析
文章目录 前言 参考目录 测试方法 配置说明 Demo 方法 功能调用流程分析 1.布隆过滤器的初始化 `tryInit` 1.1.创建布隆过滤器 1.2.初始化布隆过滤器 1.2.1.计算 bit ...
- 案例开发分析 || Scheduler组件
准备使用WebMagic实现爬取数据的功能.这里是一个比较完整的实现. 在这里我们实现的是聚焦网络爬虫,只爬取招聘的相关数据. 业务分析 今天要实现的是爬取https://www.51job.com/ ...
- BloomFilter–大规模数据处理利器(转)
BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求1 ...
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...
- Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
转载自 https://blog.csdn.net/wang0112233/article/details/79558612 https://www.sohu.com/a/230787856_231 ...
- Scrapy-redis 源码分析 及 框架使用
From:https://blog.csdn.net/weixin_37947156/article/details/75044971 From:https://cuiqingcai.com/6058 ...
- HBase读链路分析
简介:HBase的存储引擎是基于LSM-Like树实现的,更新操作不会直接去更新数据,而是使用各种type字段(put,delete)来标记一个新的多版本数据,采用定期compaction的形式来归档 ...
- 【算法】BloomFilter 如何判断一个元素在亿级数据中是否存在?
1.概述 转载: 如何判断一个元素在亿级数据中是否存在? 前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高 ...
- redis 缓存预热_Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析...
不管你在工作中还是面试中,Redis异常问题的解决方案都是不得不去学习了解的,下面来细品一下! 一.缓存雪崩 1.什么是缓存雪崩? 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数 ...
最新文章
- 机器学习-类别不平衡问题
- 程序员专属段子集锦 1/10
- 1047 糖果 01背包扩展
- c语言文件包含试题,C语言文件练习题含答案
- 阿里云搭建MQTT服务器
- syn包发送(拒绝攻击,但是有问题)
- android6.0重力工具箱,真正免root的重力工具箱详细使用教程
- python requests 乱码_解决使用requests中文乱码
- Ouroboros for Mac(AE路径生长MG动画脚本)
- unity支持的模型数据格式,unity3d模型制作规范
- window global
- [转] Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决...
- cocos做飞机大战笔记【敌机发射子弹】
- Hadoop数据采集方案
- UAP Resource
- MissionPlanner日志保存方法
- Golang实习生字节一面
- 支付宝可以给微信好友转账了?这项新功能体验没那么简单
- 查看PHP版本的方法
- VM的下载与安装(一)