【后端基础】布隆过滤器原理

文章目录

    • 一、Bloom Filter(布隆过滤器)概述
      • 1. Bloom Filter 的特点
      • 2. Bloom Filter 的工作原理
    • 二、示例
      • 1. 添加与查询
      • 2. 假阳性
    • 三、Bloom Filter 的操作
      • 1、假阳性概率
      • 2、空间效率
      • 3、哈希函数的选择
    • 四、应用

Bloom Filter 是一种非常高效的概率型数据结构,广泛应用于需要快速判断元素是否在集合中的场景。虽然它可能会产生假阳性,但通过调整位数组的大小和哈希函数的数量,可以控制假阳性率。在内存受限的环境中,Bloom Filter 提供了一个非常节省空间的解决方案。

通过适当的哈希函数和合理的配置,Bloom Filter 在大数据系统、搜索引擎、网络安全等领域具有广泛的应用前景。

一、Bloom Filter(布隆过滤器)概述

Bloom Filter 是一种空间高效的概率型数据结构,用于测试一个元素是否属于一个集合。它的特点是可以快速地判断某个元素是否在集合中,但是有一定的假阳性率。也就是说,Bloom Filter 可能会错误地告诉你某个元素存在,但实际上它并不在集合中;然而,假阴性(即元素确实存在,但 Bloom Filter 却说它不存在)是永远不会发生的。

1. Bloom Filter 的特点

  1. 空间高效: 相较于传统的哈希表,Bloom Filter 在固定大小的情况下可以表示一个元素数量极大的集合。它不需要存储实际的元素值,而是通过一组哈希函数和一个位数组来表示集合。

  2. 永不产生假阴性: Bloom Filter 不会错误地告诉你某个元素不存在,只会可能错误地告诉你某个元素已经存在(即假阳性)。

  3. 增加元素时不会失败: 向 Bloom Filter 中添加元素不会失败,但是随着添加的元素增多,假阳性率会逐渐增加,直到所有的位都被设置为 1 为止,在此时所有查询都会返回存在的结果。

  4. 无法删除元素: 删除元素在 Bloom Filter 中是不可能的,因为如果清除某个哈希值对应的位,会影响其他元素的存在性。例如,如果你删除 “geeks”,可能会错误地删除 “nerd”。这就是 Bloom Filter 无法删除元素的原因。

 

2. Bloom Filter 的工作原理

Bloom Filter 的基本操作包括:

  • 插入元素(insert):通过多个哈希函数计算出元素的哈希值,并将这些哈希值对应的位设置为 1。
  • 查询元素(lookup):同样计算该元素的哈希值,如果对应位全为 1,则认为元素可能存在;如果有任何一个位是 0,则可以确定元素不在集合中。

二、示例

1. 添加与查询

通过概率+节点个数来决定布隆过滤器的函数个数、数组位数

假设我们有一个长度为 10 的位数组,所有位初始值为 0,我们使用 3 个哈希函数来添加 “geeks” 和 “nerd” 这两个元素。

在这里插入图片描述

  1. 添加 “geeks”

    • 计算哈希值:
      • h1(“geeks”) % 10 = 1
      • h2(“geeks”) % 10 = 4
      • h3(“geeks”) % 10 = 7
    • 将位数组中的索引 1、4、7 设置为 1。
  2. 添加 “nerd”

    • 计算哈希值:
      • h1(“nerd”) % 10 = 3
      • h2(“nerd”) % 10 = 5
      • h3(“nerd”) % 10 = 4
    • 将位数组中的索引 3、5、4 设置为 1。

在这里插入图片描述

  1. 查询 “geeks”
    • 计算哈希值并检查位数组中的相应位置:
      • 如果所有索引(1、4、7)对应的位都为 1,则 “geeks” 可能存在。
        在这里插入图片描述

 

2. 假阳性

由于多个元素可能会映射到同一位,Bloom Filter 会发生假阳性。例如,当我们查询 “cat” 时,计算出哈希值为 1、3、7,查到这三个位置的值为 1,虽然 “cat” 并没有被添加到 Bloom Filter 中,但它的哈希值与其他元素(如 “geeks” 和 “nerd”)重合了,因此 Bloom Filter 错误地认为 “cat” 存在。这就是假阳性。
在这里插入图片描述

 

三、Bloom Filter 的操作

  • insert(x):将元素 x 插入到 Bloom Filter 中。
  • lookup(x):检查元素 x 是否存在于 Bloom Filter 中,返回“可能存在”或“肯定不存在”。

1、假阳性概率

假阳性概率可以通过以下公式计算:

P = ( 1 − ( 1 − 1 m ) k n ) k P= \left( 1 - \left( 1 - \frac{1}{m} \right)^{kn} \right)^k P=(1(1m1)kn)k

其中:

  • m 是位数组的大小,
  • k 是哈希函数的数量,
  • n 是预计插入元素的数量。

位数组大小的计算

m = − n ⋅ ln ⁡ ( p ) ( ln ⁡ ( 2 ) ) 2 m= \frac{-n \cdot \ln(p)}{(\ln(2))^2} m=(ln(2))2nln(p)

哈希函数数量的计算

k = m n ⋅ ln ⁡ ( 2 ) k= \frac{m}{n} \cdot \ln(2) k=nmln(2)

 

2、空间效率

Bloom Filter 的空间效率非常高。传统的集合存储结构(如哈希表、数组或链表)需要存储数据本身,而 Bloom Filter 只需要一个位数组,这使得它在内存使用上非常高效。
 

3、哈希函数的选择

Bloom Filter 使用的哈希函数应该是独立且均匀分布的。常用的非加密哈希函数如 MurmurHashFNVJenkins 都能很好地工作。加密哈希函数虽然稳定且具有较强的保证,但在性能上较慢,因此在 Bloom Filter 中更常用非加密哈希函数以提高性能。

 

四、应用

  1. 中等大小的集合过滤:Medium 用 Bloom Filter 来推荐用户已经看过的帖子,从而避免重复推荐。
  2. Quora:实现了一个共享的 Bloom Filter,过滤用户已经看过的帖子。
  3. Google Chrome:用 Bloom Filter 来识别恶意 URL。
  4. 大数据存储系统:Google BigTable、Apache HBase、Apache Cassandra 和 PostgreSQL 等都使用 Bloom Filter 来减少磁盘查询,特别是在没有存在的行或列时。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch实现论文之三元DCGAN生成RGB图像用于红外图像着色生成

简介 简介:采用了三次DCGAN单独生成单通道图像之后进行组成RGB图像放入鉴别器中检测,并在鉴别器和生成器的损失训练中采用梯度方法来提升或者降低权重。该方法将用于获得红外图像着色的生成。 论文题目:Infrared Image Colorization based on a Triplet DCGAN Architectur…

Qt中QDockWidget的使用方式

在PyQt5中使用QDockWidget可以创建灵活的停靠窗口,增强应用程序的多功能性。以下是详细的步骤和示例代码: 基本步骤 导入模块:确保导入必要的PyQt5模块。创建主窗口:继承QMainWindow并初始化界面。设置中心部件:例如…

docker独立部署milvus向量数据库

milvus镜像:国外封锁,国内源也不好用。基本上所有源都不能用 首先想到阿里云服务,但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…

【SpringBoot整合系列】HttpClient远程访问的示例

前言 使用Apache的HttpClient库,添加Apache HttpClient的依赖。工具类的封装。通常,工具类需要处理GET、POST请求,可能还有其他方法如PUT、DELETE。需要设计一个工具类,提供静态方法,可以发送请求,并处理响…

Git操作整体流程

文章目录 1.Git创建个人仓库2、Git全局配置3、Git本地管理4. Git本地管理常用命令汇总5、使用Git命令将项目提交到远程码云管理6.使用IDEA进行管理7、Idea里面的终端8、关于提交总结 1.Git创建个人仓库 打开https://gitee.com/,登录个人账号,右上角加号…

MySQL MHA 部署全攻略:从零搭建高可用数据库架构

文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…

如何查看java的字节码文件?javap?能用IDEA吗?

编译指令: javac YourProject.java 查看字节码文件的指令: javap -c -l YourProject.class 不添加-c指令就不会显示字节码文件: 不添加 -l 就不会显示源代码和字节码文件的对应关系: 添加-l之后多出来这些: IDEA不太…

1、Window Android 13模拟器 将编译的映像文件导入Android Studio

1、环境准备 编译环境:Ubuntu-18.04.5编译版本:android13-release下载地址:清华大学开源软件镜像站AOSP # 下载repo # 同步代码:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…

JUC并发—9.并发安全集合三

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …

报错:Cannot read properties of null (reading ‘ce‘)解决方法

背景 工作项目中要做右键菜单打开趋势图弹窗的需求,这个弹窗使用了vue-resizable的第三方插件,这个插件的主要作用是把弹窗设置为可拖拽的效果。这个用vue-resizable做的弹窗已经做好了,在别的项目中能够正常的运行。但是我把它拿过来放在新…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options

ngx_process_options 声明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定义在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …

数据结构系列二:包装类+泛型

包装类泛型 一、包装类(1)基本数据类型和对应的包装类(2)装箱和拆箱 二、泛型(1)什么是泛型(2)引出泛型(3)语法(4)泛型类的使用1.语法…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言:金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时,其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中,量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Spring容器初始化扩展点:ApplicationContextInitializer

目录 一、什么是ApplicationContextInitializer? 1、核心作用2、适用场景 二、ApplicationContextInitializer的使用方式 1、实现ApplicationContextInitializer接口2、注册初始化器 三、ApplicationContextInitializer的执行时机四、实际应用案例 1、动态设置环境…

hive—常用的函数整理

1、size(split(...))函数用于计算分割后字符串数组的长度 实例1):由客户编号列表计算客户编号个数 --数据准备 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…

vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据

需求:本地上传excel 文件,但需要对excel 文件的内容进行解析,然后展示出来 1. 安装依赖 首先,确保安装了 xlsx 库: bash复制 npm install xlsx 2. 创建 Vue 组件 创建一个 Vue 组件(如 ExcelUpload.v…

若依框架实现动态失效时间JWT Token的实践指南

一、功能需求背景 在前后端分离架构中,JWT(JSON Web Token)作为无状态认证方案被广泛使用。若依(RuoYi)框架的TokenService默认采用固定失效时间策略,但在实际开发中常需要根据业务场景动态调整Token有效期…

C++ 设计模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基础策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…

国产编辑器EverEdit - 如何在EverEdit中管理工程?

1 工程管理 1.1 应用场景 用户创建工程后&#xff0c;会涉及到工程的管理 &#xff0c;比如&#xff1a;打开工程、关闭工程等 1.2 使用方法 1.2.1 打开工程 单击主菜单工程 -> 打开工程&#xff0c;会弹出打开对话框&#xff0c;用户在对话框中选择需要打开的工程文件即…

MYSQL-数据库-DDL-DML-DQL-DCL-基础学习

MySql概念&#xff1a; 建立在关系模型基础上&#xff0c;有多张相互连接的二维表组成的数据库 SQL通用语法&#xff1a; 1.SQL语句可以单行或多行书写&#xff0c;以分号结尾 2.SQL语句可以使用空格/缩进来增强语句的可读性 3.MySQL数据库的SQL语句不区分大小写&#xff0c;关…