哈希的应用->布隆过滤器

news2024/11/24 17:44:04

为什么用布隆过滤器

这个是基于位图的一个超级牛皮的一个数据结构。举个例子,假设我们创建Steam账号,我们的账户名字是不允许重复的,所以我们需要找到一个没有人使用过的名字,但是我们得知道现在这个名字是否有人用过,就得去访问服务器数据库查询名字是否被使用,由于服务器的交互远程的方式,所以我们“名字”这个数据需要去服务器中查询是否重复。

 但是如果一个名字就要直接访问服务器存储空间,效率是底下的,数据在服务器是以磁盘方式存储,在远端又是磁盘存储,访问速度大大降低,你也不想一个名字访问这么久吧?

如果不想在门槛上就流失客户,我们应该加一层数据层,用来快速访问用户名是否存在的数据

记住,计算机世界问题解决不了就加一层,如果还是解决不了再加一层。

所以我们需要在服务器与客户端交互中做一个中间层

布隆过滤器原理

这时候我们的布隆过滤器运势而生!!他结合哈希算法与位图,大大提升查询速度而且节省空间,毕竟我们只是想知道这个数据是否存在于集合中,所以可以使用位图比特位来确定。

而且这也保护了数据的安全性,只有比特位数据,没有哈希算法的情况下,不会造成用户名数据外流的情况。

 但是有一个问题有摆在我们的面前,就是可能出现误判数据的情况。如果这时候来了一个新的字符串需要映射但是在哈希算法后的到的数字也是102931呢?

这个时候我们就不能只以一个比特位为一个标识位,根据大佬数学推算出开---开数据范围5倍的空间时,既节省空间有大大降低了误判率(为什么不是准确呢?应为哈希算法是将字符串转换为下标数字,既然是字符串转换数字,就一定有可能存在两个字符串转换相同的数字情况),我们需要增加不同的哈希算法数量,保证了多位映射(多位映射也无法避免误判)。

 这样尽管不同的字符串映射后有一位比特位,和其他字符串映射比特位相同,那么依旧有其他位的映射,只有所有位都映射了才说明,该字符串已被标记在布隆过滤器中。

但是有一个误判情况是避免不了的。假设我们的布隆表已创建完毕,现在需要查询一个字符串“Finish”是否在集合中存在,原本该字符串是不存在的,但是通过3个哈希算法得出的整型映射的位都被其他映射的占用了,会出现存在的假象-->误判

 所以误判行为是无法避免的,字符串可能性是无穷无尽的,我们的映射位有可能被多个数据所映射着,所以布隆过滤器也有所不足,当时作为数据库的辅助工具足以。

举个例子:信用黑名单毕竟是少数人,将失信名单从数据库放入布隆过滤器中,如果来了个人查询,

如果布隆中不存在,就不用再去访问数据库,直接返回不在黑名单

如果布隆中是存在,再去数据库核实是否真实存在,再将结果返回,毕竟这可是大事,不能误判。

再举了个例子:

游戏名字不可重复,数据库会将所有游戏名都放入布隆过滤器中,玩家创建名字的时候,会拿着名字取布隆过滤器中查看,这个名字不存在就允许创建,名字存在就直接返回不让创建,但是误判也没啥,直接返回告诉玩家换个昵称就好。

代码:

template<class K,size_t N,class Hash1, class Hash2, class Hash3>
//三个哈希算法帮我们映射位
class BloomFilter
{
public:
	void set(const K&key)
	{
		size_t hash1 = Hash1(key) % (_ratio * N);
		_bits.set(hash1);
		size_t hash2 = Hash2(key) % (_ratio * N);
		_bits.set(hash2);
		size_t hash3 = (Hash3(key) % (_ratio * N);
		_bits.set(hash3);
        //映射3个比特位
	}
	bool test(const K& key)
	{
		size_t hash1 = Hash1(key) % (_ratio * N);
		if (!_bits.test(hash1))
			return false;
		size_t hash2 = Hash2(key) % (_ratio * N);
		if (!_bits.test(hash2))
			return false;
		size_t hash3 = Hash3(key) % (_ratio * N);
		if (!_bits.test(hash3))
			return false;
        //查询数据的时候,3个位都得查看,但凡一个不存在就直接返回false
		return true;
        //存在或者误判存在
	}

private:
	const static size_t _ratio = 5;//开5倍的空间
	bitset<ratio*N> _bits; //位图当底层结构
};

我们的位图一位比特位映射

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

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

相关文章

VMware ESXi 7.0 U3n macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0 U3n macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#x…

利用Docker部署程序

目录 一、安装Docker程序 二、安装MySQL 三、安装MongoDB 四、安装Redis 五、安装RabbitMQ 六、部署人脸识别程序 一、部署工作流项目 二、打包Java项目 三、部署Java项目 一、安装Docker程序 这节课我们要利用Docker环境部署很多东西&#xff0c;有数据库、人脸识别程…

冯诺依曼结构和操作系统的理解

在正式讲解进程之前&#xff0c;需要先铺垫一些基本知识. 目录 冯诺依曼结构 操作系统 冯诺依曼结构 这个名词相信大家非常熟悉&#xff0c;我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 这张图…

Tomcat工作原理

一、Tomcat架构 ### 说明&#xff1a; Server&#xff1a;表示整个 Tomcat Catalina servlet 容器&#xff0c;Server 中可以有多个 Service。&#xff08;可以通过telenet 8005后连接后输入“SHUTDOWN” 注意这里是大写&#xff0c;来关闭服务&#xff09;Service&#xff1…

宠物用品小程序怎么做

宠物用品小程序功能介绍&#xff1a; 1. 商品管理&#xff1a; 宠物用品小程序提供了商品管理功能&#xff0c;商家可以方便地添加、编辑和删除商品信息。用户可以浏览并选择合适的宠物用品&#xff0c;如食品、玩具、服饰等。 2. 订单管理&#xff1a; 用户可以在宠物用品…

区块链服务网络BSN季度版本迭代说明【2023年Q2】

根据区块链服务网络发展联盟计划安排&#xff0c;BSN将每周进行一个小的版本迭代&#xff0c;每季度进行一个大的版本迭代&#xff0c;目前区块链服务网络&#xff08;BSN&#xff09;已完成最新季度版本迭代。 我们将按照BSN官方专网&#xff08;国内版和国际版&#xff09;、…

手把手教你从零开始集成声网音视频功能(iOS版)

说明 1.环信音视频和声网音视频 是两个不同的系统&#xff0c;所以如果要切换的话&#xff0c;需要集成声网的sdk&#xff0c;环信音视频的sdk可以直接废弃 2.文章会介绍如何用声网的音视频跑通demo&#xff0c;可以了解整个音视频通话的流程&#xff0c; 3.文章会介绍已经集…

小心 MybatisPlus 的一个坑

小心 MybatisPlus 的一个坑 昨天测试说有个 xx 功能用不了&#xff0c;扔给我一个截图&#xff0c;说有报错&#xff1a; 报错信息就是&#xff1a;Transaction rolled back because it has been marked as rollback-only&#xff0c;很好理解&#xff1a;事务被回滚了&#x…

【Qt QML入门】Text

Text组件在场景中添加格式化文本, 提供的是只读文本。文本项可以显示纯文本和富文本。Text {id: txttext: "Hello World!"font.family: "Helvetica"font.pointSize: 24color: "red" } 也可以支持部分Html格式标签 Text {id: txt1font.pointSize…

python_day6_异常与包机制

异常 try:可能出现异常的代码 except:若出现异常执行的代码 try:f open("D:/linux.txt", "r", encoding"utf-8")f.readlines() except:print("出现异常了&#xff0c;文件不存在&#xff0c;更换模式w")# f open("D:/linux.txt…

欧姆龙以太网口怎么和电脑连接

捷米特JM-ETH-CP以太网通讯处理器用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集&#xff0c;捷米特JM-ETH-CP以太网模块不占用 PLC 通讯口&#xff0c;即编程软件/上位机软件通过以太网对 PLC 数据监控的同时&#xff0c;触摸屏可以通过复用接口与 PLC 进行通讯。支持…

【国密】SM3密码杂凑算法(附源码分析)

一、前言 SM3 算法是中国国家密码管理局于 2010 年发布的一种密码杂凑算法&#xff0c;广泛地应用于数据的完整性校验、数字签名、消息认证码、密钥交换和数据加密等。密码杂凑算法需要满足三种基本属性&#xff1a;抗原像攻击、抗第二原像攻击、抗碰撞攻击&#xff0c;这三种…

【动手学习深度学习--逐行代码解析合集】14多输入多输出通道

【动手学习深度学习】逐行代码解析合集 14多输入多输出通道 视频链接&#xff1a;动手学习深度学习–多输入多输出通道 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、多输入通道 import torch from d2l import torch as d2l …

[C语言][小游戏][猜拳游戏]

C语言的奇妙旅行 一、模块化编程二、游戏基本设计2.1 确定计算机要出的手势2.2 显示“石头剪刀布”&#xff0c;然后玩家输入自己要出的手势2.3进行输赢判断&#xff0c;显示结果2.4询问是否继续2.5 基本程序 三、游戏实现的过程3.1将玩家的手势和电脑的手势显示出来 三、总代码…

复习java基础

复习一天有点忘了的知识&#xff1a; 结构化编程 结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 指导思想 自顶向下、逐步求精、模块化 编程过程 流程图是…

CVPR 2023 | OVSeg: Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP

CVPR 2023 | OVSeg: Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP 论文&#xff1a;https://arxiv.org/abs/2210.04150代码&#xff1a;https://github.com/facebookresearch/ov-seg 架构设计 类别无关的 mask proposal generator&#xff1a;MaskFormer手动…

linux端口被占用 关闭端口

1.查看端口是否被占用 netstat -anp |grep [端口号]2.查看占用的进程 lsof -i:[端口号]3.关闭进程 kill -9 [进程PID]LISTEN 表示被占用&#xff0c;3061/java 分别是&#xff1a;进程PID/进程 通过进程PID关闭进程

桥接模式:解耦抽象与实现

桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。本文将深入探讨桥接模式的原理、结构和使用方法&#xff0c;并通过详细的 Java 示例代码来说明。 1. 桥接模式的定义 桥接模式是一种将抽象部分与实现部分分离的设计模…

数字信号处理复习知识点

目录 第一章&#xff1a;时域离散系统 1.什么是因果性和稳定性 2.模拟频率&#xff0c;模拟角频率&#xff0c; 数字频率之间的关系 3.什么是频谱混叠&#xff1f; 第二章&#xff1a;时域离散信号和系统的频域分析 1.时域离散信号傅立叶变换的定义 2.如何用模拟信号的傅立…

电信青年员工踏上三千里数字化追梦之旅,数字员工为电信高质量发展注智赋能

导语&#xff1a; 近年来&#xff0c;广西电信紧紧围绕集团战略&#xff0c;聚焦产业数字化发展机遇&#xff0c;加强前瞻性技术研究和人工智能产业应用研究&#xff0c;为夯实高质量发展增添科技动力。 在数字中国建设的大背景下&#xff0c;广西电信全资子公司广西壮族自治区…