143.布隆过滤器原理以及Go使用示例

news2024/9/21 14:38:56

文章目录

  • 1. 是什么?
  • 2. 干什么?
  • 3. 为什么?
  • 4. 有什么问题?
  • 5. Go使用布隆过滤器
    • 单机版(Golang)
    • 分布式版(Java)

1. 是什么?

  • 它是一个二进制bit数组,初始为 0
    在这里插入图片描述

  • 采用位存储数据结构,节省存储空间

  • 1 存在,0 不存在

  • 可以添加,但是不能删除

  • 存在误判

2. 干什么?

用于快速查找一个集合中是否存在某个元素。尤其是大数据量中快速查找判断是否存在的问题。目的就是“大海捞针”

使用场景:

  • 10亿个手机号中如何快速判断10万个号码是否存在?
  • 白名单设置,如何正确识别合法用户?
  • 黑名单校验垃圾短信

3. 为什么?

因为它主要的作用在于快速查找,我们通过元素查找的过程说明具体的原理和可能存在的问题。

假设,现有一个集合【码,道】,我们查找某元素是否存在?

1、存储逻辑

使用多个不同hash散列函数对“码”“道”进行计算,对应下标 标记为 1

在这里插入图片描述

2、查找逻辑

1、查找示例

例如,在这个集合中,我们查找一个元素“易”。

2、查找步骤

使用多个不同hash散列函数对“易”进行计算

查找标记位全为 1代表存在,有一个为 0 代表不存在

如图示,“易”字在最后的位置计算的hash值对应为0,判定不存在集合中。

在这里插入图片描述

4. 有什么问题?

(1)什么是误判?

因为hash计算会产生hash冲突(或者hash碰撞)的问题。这就意味着:不同的字符可能存在相同的hash结果值。如下图,“ 有” 和“道” 经过多个hash计算出相同的值。那么可能判定“有” 也存在于集合中,从而产生误判。

在这里插入图片描述

总结:不存在一定不存在,存在不一定存在。

(2)为什么不能删?

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,它允许一定的误报率。但是它不支持删除操作。

主要由于哈希函数可能存在冲突(即不同的元素映射到相同的位置),因此一旦某个位置被设置为1,它就可能表示多个元素。如果尝试删除一个元素,那么就需要将该元素映射到的所有位置都重置为0。但是,这样做可能会影响到其他也映射到这些位置的元素,因为无法确定哪些1是由当前要删除的元素设置的,哪些是由其他元素设置的。

例如,紧跟上边的思路,要是删除“有”,就要将下标【3,7,8】同时置为 0 。显然误删了 “道”。

在这里插入图片描述

(3)有没有办法解决Hash冲突?

关于这个问题。只能说,减小出现hash碰撞的概率。而不能彻底杜绝. 对此,有同学肯定想:

  • 拉长点:增加bit位数
    在这里插入图片描述

  • 更散列:再多用点hash函数

事实上,在实际使用中,我们也会根据预估的业务数据,设置总位数和容错率这两个重要参数。这就是怎么用的问题。

5. Go使用布隆过滤器

Go语言里有必要用布隆过滤器嘛?

Go语言中是否需要使用布隆过滤器取决于您的具体应用需求。布隆过滤器是一种用于判断一个元素是否属于一个集合的数据结构,它具有高效的查询速度和较小的内存占用,但也有一定的误判率。

因此,使用布隆过滤器通常是基于以下考虑:

  1. 需要快速查询元素的存在性:如果您的应用程序需要快速确定一个元素是否属于一个集合,而不需要精确的存在性验证,布隆过滤器是一个合适的选择。它的查询速度比在数据库或其他数据结构中搜索要快得多。

  2. 内存资源有限:如果您希望在内存资源受限的情况下存储大量的元素或数据,布隆过滤器可以节省内存。它的内存占用通常比存储实际元素的数据结构小得多。

  3. 容忍一定的误判率:布隆过滤器具有一定的误判率,即它可能会将不存在于集合中的元素误报为存在。如果您的应用程序可以容忍一些误报,那么使用布隆过滤器是合理的。

  4. 需要高性能:布隆过滤器的查询速度非常快,因为它通常只需要几个哈希计算和位操作。这使它非常适合需要高性能的应用。

布隆过滤器在一些应用场景下非常有用,例如缓存缺失优化、重复数据过滤、恶意输入检测等。但它并不适用于所有情况,特别是对于需要绝对准确性的情况。

在使用布隆过滤器时,需要仔细考虑误判率和容忍度,并根据应用的需求来选择合适的配置参数。布隆过滤器通常用于辅助数据结构,而不是替代传统数据库或数据存储。

布隆过滤器通常用于以下场景:

  • 缓存缺失优化:当需要查找的数据量很大,而内存有限时,可以使用布隆过滤器来快速判断某个数据是否存在于缓存中,从而减少磁盘或网络访问。

  • 重复数据过滤:在某些情况下,需要避免重复数据的插入。布隆过滤器可以用来快速判断一个数据是否已经存在,避免重复。

  • 防止恶意输入:在网络应用中,可以使用布隆过滤器来检测恶意输入,例如防止恶意爬虫或垃圾邮件。

  • 分布式系统:在分布式系统中,布隆过滤器可以用来判断某个数据是否需要从远程节点获取,从而减少网络开销。

单机版(Golang)

下面是一个简单的示例,演示如何在Go中使用布隆过滤器。您可以使用第三方库来实现布隆过滤器,如 github.com/wangjia184/sortedset/bf

首先,您需要安装这个库:

go get github.com/wangjia184/sortedset/bf

然后,您可以编写代码来创建和使用布隆过滤器:

package main

import (
    "fmt"
    "github.com/wangjia184/sortedset/bf"
)

func main() {
    // 创建一个布隆过滤器,参数分别是预期的元素数量和错误率
    filter := bf.New(10000, 0.01)

    // 添加元素到布隆过滤器
    filter.Add([]byte("example"))

    // 检查元素是否存在于布隆过滤器中
    if filter.Has([]byte("example")) {
        fmt.Println("Element 'example' is in the filter.")
    } else {
        fmt.Println("Element 'example' is not in the filter.")
    }

    if filter.Has([]byte("nonexistent")) {
        fmt.Println("Element 'nonexistent' is in the filter.")
    } else {
        fmt.Println("Element 'nonexistent' is not in the filter.")
    }
}

布隆过滤器的大小和误判率是可以配置的,根据具体需求进行调整。但需要注意,随着误判率的降低,过滤器所需的内存空间也会增加。

在使用布隆过滤器时,应该考虑到误判率的问题,确保它在实际应用中的误判不会导致严重问题。布隆过滤器对于快速的存在性检查非常有用,但不适用于需要精确匹配的情况。

上面介绍的是单机版的布隆过滤器,但大部分时候我们需要一个分布式场景下的全局布隆过滤器,Go版本的暂时没有找到,可以先看一个Java版的。字节内部有分布式版的布隆过滤器Golang SDK ,但并未开源使用

分布式版(Java)

Java Redisson中的布隆过滤器就是分布式的。

使用 Redisson 创建布隆过滤器,插入元素,并检查某个元素是否存在。

pom.xml 文件中添加 Redisson 依赖:

<dependencies>
    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.16.1</version> <!-- 使用最新版本 -->
    </dependency>
</dependencies>

编写代码来创建布隆过滤器,插入元素,并检查元素:

import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonBloomFilterExample {

    public static void main(String[] args) {
        // 配置 Redisson 客户端
        Config config = new Config();
        config.useSingleServer()
              .setAddress("redis://127.0.0.1:6379"); // 替换为你的 Redis 服务器地址

        // 创建 Redisson 客户端实例
        RedissonClient redisson = Redisson.create(config);

        // 创建布隆过滤器
        // 注意:这里的名称 "myBloomFilter" 是布隆过滤器的唯一标识,你可以根据需要更改
        RBloomFilter<String> bloomFilter = redisson.getBloomFilter("myBloomFilter");

        // 初始化布隆过滤器,设置预期插入的元素数量和误报率
        bloomFilter.tryInit(10000L, 0.03);

        // 插入元素
        bloomFilter.add("example");
        bloomFilter.add("example1");

        // 查找元素
        boolean mightContain = bloomFilter.contains("example");
        System.out.println("布隆过滤器中可能包含'example':" + mightContain);

        // 关闭 Redisson 客户端
        redisson.shutdown();
    }
}

注意:

  • 由于布隆过滤器的特性,contains 方法返回 true 并不意味着元素一定存在,而返回 false 则意味着元素一定不存在。

  • 对于 bloomFilter.tryInit(10000L, 0.03),的参数设置,应根据实际业务给出。

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

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

相关文章

学学vue-1

vue 0 安装 装node.js&#xff0c;以及cnpm&#xff08;npm超时或者被屏蔽&#xff0c;安装cnpm国内镜像&#xff09; 查看安装版本&#xff08;是否安装成功&#xff09; node -v 安装成功之后也会安装npm npm -v cnpm镜像 npm install -g cnpm --registryhttp://registry.np…

spring如何解决bean的循环依赖

通过三级缓存解决循环依赖问题。 其中一级缓存用于存储完整的bean&#xff1b;二级缓存用于存储已经完成aop动态代理的bean&#xff0c;防止重复创建动态代理&#xff1b;三级缓存存储未实现aop动态代理和为实现依赖注入的bean。getBean()时先从一级缓存取&#xff0c;没有取二…

s3c2440---PWM使用之蜂鸣器驱动移植

一、蜂鸣器驱动介绍 1.1.什么是蜂鸣器 蜂鸣器是一种简单的声响发生器&#xff0c;常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音&#xff0c;一般使用交替电流产生声音会比较稳定。 1.2.蜂鸣器的类别 1.有源蜂鸣器 1&…

2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用等距螺线&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

嵌入式S3C2440:控制LED灯

发光二极管接口&#xff08;左端&#xff09;应为低电平 以LED1为例 LED1的接口为GPB5 void led_init(void) {//配置GPB5功能为输出GPBCON & ~(0x3 << 10);GPBCON | (0x1 << 10); //使GPB5输出高电平(关灯)GPBDAT | (1 << 5); }void led_on(void) {GPB…

【重学 MySQL】十一、SQL 概述

【重学 MySQL】十一、SQL 概述 SQL 背景知识产生与发展主要特点主要应用SQL语言的发展趋势 SQL 语言排行榜SQL 分类数据查询语言&#xff08;DQL, Data Query Language&#xff09;数据操纵语言&#xff08;DML, Data Manipulation Language&#xff09;数据定义语言&#xff0…

产品图片小程序开发:全方位指导,让产品展示更出色

想要快速开发并上线一个展示产品图片的小程序吗&#xff1f;乔拓云平台是您的理想选择。只需简单几步&#xff0c;即可打造专属的小程序平台。 首先&#xff0c;访问乔拓云官方网站&#xff0c;注册并登录您的账号。在小程序后端&#xff0c;您可以自由探索丰富的模板库&#x…

Leetcode每日刷题之155.最小栈

1.题目解析 本题是实现一个栈并且要实现其中的插入、删除、返回栈顶元素、返回最小元素的函数&#xff0c;这里主要的难点就是返回最小元素的函数&#xff0c;如果我们直接遍历&#xff0c;那么时间复杂度就是O(N)&#xff0c;但是题目要求我们需要在常数时间也就是O(1)的时间复…

shell 控制台显示彩色文字的方法

在shell脚本中,如果我们希望在控制台能显示带颜色的文字, 那就需要使用shell中的色彩专用变量代码来进行. shell中的各种颜色代码定义 # 颜色定义 BLACK"\033[0;30m" DARK_GRAY"\033[1;30m" BLUE"\033[0;34m" LIGHT_BLUE"\033[1;3…

vscode中全局代码片段怎么改名字

在使用vscode定义自己的代码片段的时候&#xff0c;有几个选项&#xff0c;如果我们选择了 vue.json 的文件定义代码片段&#xff0c;那么只能在 vue 文件中使用该片段&#xff0c;并且是 vue 文件中没有写其他代码的时候&#xff0c;如果 vue 文件中写了其他代码&#xff0c;那…

2024 小米芯片笔试

题型&#xff1a;单选题 时间&#xff1a;40分钟 知识点设计&#xff1a;数电&#xff08;很多&#xff09;、模电&#xff08;很多&#xff09;、电路(很多)、V&#xff08;4-5道&#xff09;、SV&#xff08;1道&#xff09; 感觉&#xff1a;&#xff1f;&#xff1f;&am…

Chrome extension 谷歌浏览器插件 YouTube 监听地址栏 url 变化

一、前言 最近在开发一个 YouTube 视频 AI 总结的插件&#xff0c;过程中遇到了一个问题&#xff0c;每次用户点击当前页面其它视频时&#xff0c;组件并不会重新挂载&#xff0c;这就导致视频明明都变了&#xff0c;但是总结依旧还是上次的内容&#xff0c;很影响体验。 为…

2024年全国大学生数学建模竞赛(C题) 建模解析|农作物的种植策略|小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;实现综合建模。独创复杂系统视角&#xff0c;帮助你解决国赛的难关呀。 完整内容可以…

OpenHarmony轻松玩转GIF数据渲染

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;提供了Image组件支持GIF动图的播放&#xff0c;但是缺乏扩展能力&#xff0c;不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件&#xff0c;带大家一起玩转GIF的数据渲染&#xff0c;搞…

【Java】Spring-AOP与拦截器实战 (上手图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 使用AOP与拦截器4.2.1 使用AOP4.2.1.1 设置DemoAop类4.2.2.2 设…

Linux驱动环境配置

Linux驱动环境配置 1.u-boot烧录2.Linux设置3.u-boot命令4.u-boot环境变量相关命令5.tftp安装与配置6.nfs7.配置网络环境变量8.tftp下载9.nfs挂载根文件系统 1.u-boot烧录 1.打开J-Flash 2.打开工程(Open Project) 3.Open data file 4.设置起始地址0x0 5.选择Target-Conne…

【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统

文章目录 一、系统架构1、后端&#xff1a;SpringBoot、Mybatis2、前端&#xff1a;Vue、ElementUI4、小程序&#xff1a;uniapp3、数据库&#xff1a;MySQL 二、系统功能三、系统展示1、小程序2、后台管理系统 一、系统架构 1、后端&#xff1a;SpringBoot、Mybatis 2、前端…

【学术会议征稿】第三届智慧能源与电气工程国际学术会议(SEEE 2024)

第三届智慧能源与电气工程国际学术会议&#xff08;SEEE 2024&#xff09; 2024 3rd International Conference on Smart Energy and Electrical Engineering(SEEE 2024) 在双碳目标背景下&#xff0c;能源行业正在面临着绿色低碳转型的巨大挑战。随着我国产业结构全面调整&am…

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数思维导…

09-03 周二 ansible部署与使用指南

09-03 周二 ansible部署与使用指南 时间版本修改人描述2024年9月3日10:08:58V0.1宋全恒新建文档&#xff0c;2024年9月4日13:57:25v0.2宋全恒调整结构&#xff0c;添加ansible-playbook和ansible-inventory 简介 首先要找一个跳板机&#xff0c;来确保所有的机器都可以访问。然…