(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相关推荐

  1. 【RuoYi-Vue-Plus】学习笔记 46 - Redisson(十二)布隆过滤器 BloomFilter 简单分析

    文章目录 前言 参考目录 测试方法 配置说明 Demo 方法 功能调用流程分析 1.布隆过滤器的初始化 `tryInit` 1.1.创建布隆过滤器 1.2.初始化布隆过滤器 1.2.1.计算 bit ...

  2. 案例开发分析 || ​​​​​​​Scheduler组件

    准备使用WebMagic实现爬取数据的功能.这里是一个比较完整的实现. 在这里我们实现的是聚焦网络爬虫,只爬取招聘的相关数据. 业务分析 今天要实现的是爬取https://www.51job.com/ ...

  3. BloomFilter–大规模数据处理利器(转)

    BloomFilter–大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求1 ...

  4. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  5. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

    转载自  https://blog.csdn.net/wang0112233/article/details/79558612 https://www.sohu.com/a/230787856_231 ...

  6. Scrapy-redis 源码分析 及 框架使用

    From:https://blog.csdn.net/weixin_37947156/article/details/75044971 From:https://cuiqingcai.com/6058 ...

  7. HBase读链路分析

    简介:HBase的存储引擎是基于LSM-Like树实现的,更新操作不会直接去更新数据,而是使用各种type字段(put,delete)来标记一个新的多版本数据,采用定期compaction的形式来归档 ...

  8. 【算法】BloomFilter 如何判断一个元素在亿级数据中是否存在?

    1.概述 转载: 如何判断一个元素在亿级数据中是否存在? 前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高 ...

  9. redis 缓存预热_Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析...

    不管你在工作中还是面试中,Redis异常问题的解决方案都是不得不去学习了解的,下面来细品一下! 一.缓存雪崩 1.什么是缓存雪崩? 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数 ...

最新文章

  1. 机器学习-类别不平衡问题
  2. 程序员专属段子集锦 1/10
  3. 1047 糖果 01背包扩展
  4. c语言文件包含试题,C语言文件练习题含答案
  5. 阿里云搭建MQTT服务器
  6. syn包发送(拒绝攻击,但是有问题)
  7. android6.0重力工具箱,真正免root的重力工具箱详细使用教程
  8. python requests 乱码_解决使用requests中文乱码
  9. Ouroboros for Mac(AE路径生长MG动画脚本)
  10. unity支持的模型数据格式,unity3d模型制作规范
  11. window global
  12. [转] Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决...
  13. cocos做飞机大战笔记【敌机发射子弹】
  14. Hadoop数据采集方案
  15. UAP Resource
  16. MissionPlanner日志保存方法
  17. Golang实习生字节一面
  18. 支付宝可以给微信好友转账了?这项新功能体验没那么简单
  19. 查看PHP版本的方法
  20. VM的下载与安装(一)

热门文章

  1. gdb命令行调试相关操作
  2. plc和单片机哪个更有前途?为什么本科生都不搞plc?
  3. 应用卸载后依然存在的文件目录
  4. .php中js写法,js函数常见的写法以及调用方法
  5. 【来日复制粘贴】输出匹配到的字符串
  6. python-打气球
  7. 微信+微支付+Q币+qq用户基数
  8. Android GCM使用
  9. 一台Linux服务器上挂载另一台Linux服务器文件系统的方法
  10. Activity生命周期和启动模式