浅谈布隆过滤器

2023-05-16

什么是布隆过滤器
布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或 者可能存在”。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点 是其返回的结果是概率性(存在误差)的,而不是确切的

注意:不同的数据结构有不同的适用场景和优缺点,你需要仔细权衡自己的需求 之后妥善适用它们,布隆过滤器就是践行这句话的代表。

业务场景问题思考:
1:使用word文档时,判断某个单词是否拼写正确
2:网络爬虫程序,不去爬相同的url页面
3:垃圾邮件过滤算法如何设计?
4:缓存崩溃后造成的缓存击穿?
5:FBI,一个嫌疑人的名字是否已经在嫌疑名单上?

常规思路:
数组
链表
树、平衡二叉树、Trie
Map (红黑树)
HashMap

上述方法在数据量不大的情况下其实已经很好的解决了问题,但是存在一个很大的局限性,就是存储了元素的key值,当数据量达到千万甚至亿级别的时候,就会因为内存过大的问题无法继续,下面具体分析一下上述几个思路的局限性:
为什么不用HashMap: 值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率 也非常高,但是存在两个问题:1存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满 2存储了key,类似URL则非常占空间,下面给出一张hashmap数量和内存空间占用、插入耗时对照表:
在这里插入图片描述
为什么不直接使用hash table?
哈希表的存储效率一般只有 50%(为了避免高碰撞,一般哈希存到一半时都翻倍 或采取其他策略),所以很费内存;

Hash面临的问题就是冲突。假设 Hash 函数是良好的,如果我们的位阵列长度为 m 个点,那么如果我们想将冲突率降低到例如1%, 这个散列表就只能容纳 m/100 个 元素。

解决方法较简单,使用k>1的布隆过滤器,即k个函数将每个元素改为对应于k个 bits,因为误判度会降低很多,并且如果参数k和m选取得好,一半的m可被置为 为1

由于上述局限性,布隆过滤器就出现了
布隆过滤器本质:
布隆过滤器是一个 bit 向量或者说 bit 数组(长度到底到底多长),如下所示:
在这里插入图片描述
注意:布隆过滤器唯一消耗内存的地方就是构建过滤器bit向量,过滤器是一开始就已经分配好固定大小不可变的空间(而向量表的大小只和设计之初元素数量级别、允许容忍的误报率有关,和元素key本身大小没有任何关系,因为过滤器只记录key对应的hash的布隆过滤器位图映射),后续每次把key新增到过滤器中不会再额外消耗任何内存。
布隆过滤器的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元 素映射成一个位数组中的K个点,把它们置为1。 检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:
◼ 如果这些点有任何一个0,则被检元素一定不在;
◼ 如果都是1,则被检元素很可能(我们期望存在的概率是多少可以设置)存 在。 这就是布隆过滤器的基本思想。
(1) 例如针对值 “baidu” 和三个不同的哈希函数分 别生成了哈希值 1、4、7,则过滤器情况如下图:
在这里插入图片描述
(2) 再存一个值 “tencent”,如果哈希函数返回 3、4、8 的 话,则过滤器情况如下图:
在这里插入图片描述
4 这个 bit 位由于两个哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 “yahusousuo” 这个值是 否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到 这个 bit 位上,因此我们可以很确定地说 “yahusousuo” 这个值不存在。而当我们需要查询 “baidu” 这个值是否存在的 话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。 这是为什么呢?答案更简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。 -> 误判率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
布隆过滤器一个很关键的点—Hash函数选择

◼ 常见的应用比较广的hash函数有MD5, SHA1, SHA256,一般用于信息安全方面, 比如签名认证和加密等。 比如我们传输文件时习惯用对原文件内容计算它的MD5值,生成128 bit的整数,通 常我们说的32位MD5值,是转换为HEX格式后的32个字符。
◼ MurmurHash是2008年发明的,相比较MD5, MurMurhash不太安全(当然MD5也被 破译了, sha也可以被破译),但是性能是MD5的几十倍; MurmurHash有很多个版 本, MurmurHash3修复了MurmurHash2的一些缺陷同时速度还要快一些,因此很多 开源项目有用,比如nginx、 redis、 memcashed、 Hadoop等,比如用于计算一致性 hash等。
◼ MurmurHash被比较好的测试过了,测试方法见 https://github.com/aappleby/smhasher, MurMurhash的实现也可以参考smhasher,或 者参考https://sites.google.com/site/murmurhash。

在线验证公式
测试网址:https://hur.st/bloomfilter/
在这里插入图片描述
在这里插入图片描述
可以删除元素吗?
在布隆过滤器算法中,不能因为有碰撞的可能,那即添加一个元素后,如 果设置了k个bit为1,且某个bit位碰撞后,我们删除该元素时恰恰设置该bit 位为0,则碰撞的元素无法判断,那么即不能在布隆过滤器中删除元素 。

布隆过滤器可以重置迁移吗?—布隆过滤器扩容
我们知道,布隆过滤器是不可变的,但如果布隆过滤器容量确实不够了,该怎么办呢?或者如果要每个月都删除几个月前的去重数据,该如何处理呢?这边要记录一种布隆过滤器的巧用,多个布隆过滤器组成的循环布隆过滤器。因为布隆过滤器的不可逆,我们没法重新建一个更大的布隆过滤器然后去把数据重新导入,但是可以在数据库中读取key,重新构建更大的过滤器,只是说不能过滤器之间数据迁移。这边采取的扩容的方法是,保留原有的布隆过滤器,建立一个更大的,新增数据都放在新的布隆过滤器中,去重的时候检查所有的布隆过滤器。

布隆过滤器解决缓存穿透:

缓存穿透(大量查询一个不存在的key)定义:缓存穿透,是指查询一个数据库中不一定存在的数据;

正常使用缓存查询数据的流程是,依据key去查询value,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

如果每次都查询一个不存在value的key,由于缓存中没有数据,所以每次都会去查询数据库;当对key查询的并发请求量很大时,每次都访问DB,很可能对DB造成影响;并且由于缓存不命中,每次都查询持久层,那么也失去了缓存的意义。

解决方法—布隆过滤器:
将数据库中所有的查询条件,放入布隆过滤器中,当一个查询请求过来时,先经过布隆过滤器进行查,如果判断请求查询值存在,则继续查;如果判断请求查询不存在,直接丢弃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈布隆过滤器 的相关文章

  • 面试题1:OS或者编译器怎么识别是全局变量还是局部变量

    OS或者编译器怎么识别是全局变量还是局部变量 操作系统内根本不关心你是什么变量 xff0c 它只管代理运行程序 xff0c 也就是进程 xff0c 负责这些进程之间的调度 xff0c 不过如果要说操作系统本身也是进程 xff0c 那倒可以理
  • 面试题4:数组、指针、引用的联系区别

    数组和指针 xff1f xff1f xff1f 从两个方面来看 xff0c 一是作为一个语言 xff0c 数组是必须要支持的一种数组类型 xff0c 原因很简单 xff0c 数组是线性表的直接体现 而从编译器设计者的角度来看 xff0c 如
  • c++ 容器类 概括性介绍

    C 43 43 中的容器类包括 顺序存储结构 和 关联存储结构 xff0c 前者包括vector xff0c list xff0c deque等 xff1b 后者包括set xff0c map xff0c multiset xff0c mu
  • 海康摄像头使用RTSP

    1 协议格式 海康威视IP摄像头rtsp协议地址如下 xff1a rtsp username passwd 64 ip port codec channel subtype av stream 主码流 xff1a rtsp admin 12
  • 树莓派串口连接ESP8266

    陈拓 chentuo 64 ms xab ac cn 2020 03 12 2020 03 12 1 概述 ESP8266是物联网行业广泛使用的WiFi模块 xff0c 小巧 功能强大 xff0c 而且价格低廉 通常用电脑进行ESP8266
  • Linux 创建TCP连接流程

    文章目录 Linux创建TCP的步骤服务端客户端TCP建立流程示例代码 Linux创建TCP的步骤 TCP编程需要客户端和服务器两套编码 xff0c 其创建TCP的流程也是不完全一致的 服务端 使用socket函数创建一个套接字使用sets
  • 结构体类型完全归纳

    结构体类型 目录 基本概述 一 结构体类型变量的定义方法及其初始化 1 定义结构体类型变量的方法 2 结构体变量的初始化 二 结构体变量的引用 三 结构体数组 1 定义结构体数组 2 结构体数组应用举例 四 指向结构体变量的指针 1 类型一
  • Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包

    文章目录 目标一 D435i简介二 环境配置三 RealSense的SDK2 0安装四 ROS包安装五 摄像机CV的ROS包节点 六 问题排查 目标 在Ubuntu20 04LTS系统下安装D435i的驱动SDK2和ROS包 xff0c 实
  • C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集

    C 调用NationalInstruments的dll报错问题 问题原因 xff1a dll版本不匹配导致的 xff0c 需要做如下操作解决问题 未能加载文件或程序集 NationalInstruments Common Version 6
  • 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌

    需要授权的 API xff0c 必须在请求头中使用 添加字段 需要授权的 API xff0c 必须在请求头中使用 Authorization 字段提供 token 令牌 实现方法 通过 axios 请求拦截器添加 token xff0c 保
  • 关于HTTP解析的一点思考

    原文 似乎已经很久没有提到关于服务器的消息了 xff0c 其实我一直都在写 xff0c 只是有时事情比较多 xff0c 会耽搁一点时间 在使用C重写前 xff0c 我就已经用Dlang实现了近2个版本的HTTP解析器 xff0c 换成C之后
  • Paparazzi UAV Lisa/M2飞控使用说明书

    第一部分 地面站 Paparazzi xff08 简称PPZ xff09 UAV项目起始于2003年 xff0c 由法国民航大学发起的一套软硬件开源无人机项目 xff0c 它提供了一整套完整的无人机软硬件解决方案 PPZ 地面站软件运行在L
  • Anaconda3-2020.02-Windows-x86_64安装及使用步骤

    Conda是一个开源的包 环境管理器 xff0c 可以用于在同一个机器上安装不同版本的软件包及其依赖 xff0c 并能够在不同的环境之间切换 Anaconda包括Conda Python以及一大堆安装好的工具包 xff0c 比如 xff1a
  • vivado 2017.4安装步骤

    目录 xff1a windows安装vivado2017 4 xff1b 虚拟机ubuntu安装vivado 2017 4 xff1b ios安装vivado 一 xff0c windows安装vivado2017 4 xilinx官网下载
  • LINUX C语言TCP客户端和服务器传输结构体数据

    1 xff0c TCP服务器流程 服务器 xff1a 1 创建socket xff0c 使用socket函数 2 准备通信地址 xff0c 使用结构体类型 3 绑定socket和通信地址 xff0c 使用bind函数 4 进行通信 xff0
  • FDC系列电容传感器及FDC2214使用要点

    陈拓 2021 02 21 2021 02 21 1 概述 电容式传感是一种低功耗 低成本且高分辨率的非接触式感测技术 xff0c 适用于从接近检测 手势识别到远程液位感测的各项应用 电容式传感系统中的传感器可以采用任意金属或导体 xff0
  • 卫星数据高动态捕获

    一 xff0c 高动态导航接收终端的现状 早期的扩频通信系统由于受到集成电路水平的限制 xff0c 多采用串行搜索技术 由于串行捕获速度慢 xff0c 耗时长不能满足高动态等环境对速度的要求 xff0c 随着数字信号处理等技术的发展 xff
  • 基于ZYNQ平台的powerlink接口平台搭建

    1 xff0c 搭建powerlink接口所需硬件平台 xff1a Zynq ZC702 board used as openPOWERLINK MN AVNET expander board AES FMC ISMNET G Linux
  • 雷达测距测速测角基本原理

    由雷达发射机产生的电磁波经收发开关后传输给天线 xff0c 由天线将此电磁波定向辐射于大气中 电磁波在大气中以近光速传播 xff0c 如目标恰好位于定向天线的波束内 xff0c 则它将要截取一部分电磁波 目标将被截取的电磁波向各方向散射 x

随机推荐

  • 信号处理之脉冲压缩

    一 xff0c 脉冲压缩的背景 随着飞行技术的飞速发展 xff0c 对雷达的作用距离 分辨能力 测量精度和单值性等性能指标提出越来越高的要求 测距精度和距离分辨力对信号形式的要求是一致的 xff0c 主要取决于信号的频率结构 xff0c 为
  • MTI动目标指示和MTD动目标检测

    MTI 是一种频域滤波器 radar主席的ppt 中说到 xff0c 它是对多组脉冲回波的同一个距离单元加权求和 xff0c 得到一个结果 xff1b 也就是多个输入一个输出 xff1b 相当于一个高通滤波器 xff0c 用来抑制固定目标和
  • 复旦微开发过程中遇到的问题总结(二)

    一 xff0c 将bin文件放到flash中0地址处能识别并且启动吗 xff1f xlinx的放在0地址处可以识别启动 xff0c 我尝试复旦微这个没反应 要用procise生成 xff0c 第一个必须是FSBL out 只能是procis
  • 用链表实现fifo功能缓存和拼接数据功能

    fifo h ifndef LIST QUEUE H define LIST QUEUE H include lt stdio h gt include lt stdlib h gt include 34 xil types h 34 in
  • zynq bootgen配置启动

    一 xff0c Zynq 7000 SoC 启动头文件 0x00 0x1F Arm 矢量表 由 Bootgen 使用虚拟矢量表填充 xff08 Arm 操作代码 0xEAFFFFFE xff0c 即用于捕获未初始化矢量的 branch to
  • 制作四个文件启动的镜像

    一 环境搭建 xff1a vivado2018 3 xff0c petalinux2018 3 xff0c 1 petalinux环境设置 所使用的编译环境需要使用petalinux这个软件 xff0c 第五章Petalinux 的安装 里
  • ubuntu虚拟机更改镜像源(中科大或者阿里云镜像源)

    ubuntu虚拟机更改镜像源 xff08 中科大或者阿里云镜像源 xff09 1 进入终端后 xff0c 编辑源列表文件 xff1a 输入 xff1a sudo vim etc apt sources list 后输入 xff1a i 2
  • 海康威视客户端iVMS-4200连接NVR

    海康威视客户端 iVMS 4200 连接 NVR 陈拓 2021 07 30 2021 08 01 1 概述 iVMS 4200 客户端是一款与网络监控设备配套使用的综合应用软件 xff0c 可满足用户多方面需求 xff0c 如设备管理 人
  • 匿名上位机使用方法分享--总体介绍

    不知不觉 xff0c 匿名科创已经走过了7个年头 xff0c 这里首先要感谢大家这么久以来对匿名的支持与帮助 xff01 匿名为了提供给大家一个更好的调试工具 xff0c 始终在维护开发我们的匿名上位机软件 xff0c 7年时间 xff0c
  • 匿名上位机使用方法分享--高级收码

    匿名上位机总体介绍移步 xff1a https blog csdn net wangjt1988 article details 83684188 本文视频介绍 xff1a https www bilibili com video av35
  • 匿名上位机使用方法分享--波形显示

    匿名上位机总体介绍移步 xff1a https blog csdn net wangjt1988 article details 83684188 波形显示可以说是上位机的功能重点 xff0c 是各种调试 数据分析的有力助手 xff0c 下
  • 匿名数传使用方法分享

    目录 欢迎使用匿名数传模块匿名数传的特点硬件介绍使用介绍指示灯连接匿名飞控建议 欢迎使用匿名数传模块 大家调试各种设备时 xff0c 一般用什么方式呢 xff1f 相比答案大多是上位机 43 串口的方式 如果您还在使用usb转串口芯片然后连
  • 匿名科创--X2212版到手飞套件介绍

    匿名科创到手飞X2212版 xff0c 使用朗宇X2212系列无刷电机 xff0c 配合特制的6mm正反螺纹螺旋桨安装柱 xff0c 可以同时兼容8寸普通螺旋桨和9寸9450自锁螺旋桨 优点 xff1a 可直接使用普通8寸螺旋桨 xff0c
  • vscode最皮实的C++格式化的配置方法

    1 安装C C 43 43 2 在vscode界面 xff0c 按 34 Ctrl 43 34 进入设置界面 xff0c 搜索Format 3 设置保存文件时 xff0c 按格式对代码排版 4 向下拉 xff0c 找到下图选项 xff0c
  • 通过openmv生成apriltag标签

    Apriltag官网提供的tag图片分辨率很低 xff0c 完全无法使用 xff0c 通过openmv生成apriltag标签 生成方法如下 xff1a openmv IDE的下载与安装 openmv官方提供了各种版本的IDE xff0c
  • 串口传输数据错位 的几种解决办法

    1 代码优化等级 2 使用晶振 晶振自身产生时钟信号 xff0c 为各种微处理芯片作时钟参考 无源晶振需要用CPU内部的振荡器信号差接线麻烦石英 gt 陶瓷有源晶振是一个完整的振荡器信号好接线简单灵活性较差 3 使用降低传输速率 xff1f
  • sip 认证分析

    SIP类似Http协议 其认证模式也一样 Http协议 xff08 RFC 2616 xff09 规定可以采用Basic模式和摘要模式 xff08 Digest schema xff09 RFC 2617 专门对两种认证模式做了规定 RFC
  • MicroPython移植

    MicroPython移植 1 目标板 stm32f407zgt6 2 下载移植准备 micropython源码 arm交叉编译工具 sudo apt get install git sudo apt get install gcc arm
  • 了解ESP32睡眠模式及其功耗

    陈拓翻译 2022 05 30 2022 05 30 原文 https lastminuteengineers com esp32 sleep modes power consumption 毫无疑问 xff0c ESP32是许多WiFi
  • 浅谈布隆过滤器

    什么是布隆过滤器 布隆过滤器是一种数据结构 xff0c 比较巧妙的概率型数据结构 xff08 probabilistic data structure xff09 xff0c 特点是高效地插入和查询 xff0c 可以用来告诉你 某样东西一定