C++:Hash拓展--布隆过滤器

布隆过滤器

问题前景:

之前学习了位图,我们知道位图在大量数据查找时候是很方便的。但位图的缺陷在于只能用于整型数据。而在实际中,我们的数据更多的是更复杂的字符串或者自定义类型。那么此时位图就显得有点无力,所以就诞生了叫布隆过滤器的数据结构。

布隆过滤器:

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,主要用于快速判断一个元素是否“可能存在于”一个集合中,或者“绝对不存在于”集合中。

那可能会有疑问,为什么布隆过滤器需要映射多个值,而不只映射单个值呢?

假设我们现在需要查找名字为胡歌,此时就存在Hash冲突,胡歌明明没有插入数据,但显示已经在布隆过滤器里了,存在误判。

而我们使用多个Hash函数进行分别插入,虽然不能完全解决这个问题,但是可以大大降低误判率。

在映射的K个位置里,只要有其中一个不在,该元素就是不存在。

只有映射的K个位置里,全部在,才可能在(存在误判风险)。

布隆过滤器理论结论:

布隆过滤器的推到,这里小编就不细讲了,大家有兴趣可以自行搜索。小编就简单说下结论

当哈希函数固定时,插入的数据增加,误判率增加。开的比特位增加,误判率就减少。

判断一个数不在是准确的,判断一个数在是不准确的。

布隆过滤器代码实现:

#pragma once
#include<iostream>
#include<vector>
#include<string>using namespace std;template<size_t size>
class BitMap
{
public:BitMap(){_bm.resize(size);}void set(size_t x){int i = x / 32;int j = x % 32;_bm[i] |= (1 << j);}bool test(size_t x){int i = x / 32;int j = x % 32;return _bm[i]&(1 << j);}private:vector<size_t> _bm;
};struct HashFuncBKDR
{size_t operator()(const string& s){size_t hash = 0;for (auto ch : s){hash *= 31;hash += ch;}return hash;}
};
struct HashFuncAP
{size_t operator()(const string& s){size_t hash = 0;for (size_t i = 0; i < s.size(); i++){if ((i & 1) == 0) {hash ^= ((hash << 7) ^ (s[i]) ^ (hash >> 3));}else {hash ^= (~((hash << 11) ^ (s[i]) ^ (hash >>5)));}}return hash;}
};
struct HashFuncDJB
{size_t operator()(const string & s){size_t hash = 5381;for (auto ch : s){hash = hash * 33 ^ ch;}return hash;}
};template<size_t N, size_t X = 5, class K=string,class Hash1= HashFuncBKDR,class Hash2= HashFuncAP,class Hash3= HashFuncDJB>
class Blomm_fiter
{
public:void set(const K&key){size_t hash1 = Hash1()(key) % M;size_t hash2 = Hash2()(key) % M;size_t hash3 = Hash3()(key) % M;_bm.set(hash1);_bm.set(hash2);_bm.set(hash3);}bool test(const K&key){size_t hash1 = Hash1()(key) % M;size_t hash2 = Hash2()(key) % M;size_t hash3 = Hash3()(key) % M;if(!_bm.test(hash1)){return false;}if (!_bm.test(hash2)){return false;}if (!_bm.test(hash3)){return false;}return true;//不一定准确}// 获取公式计算出的误判率double getFalseProbability(){double p = pow((1.0 - pow(2.71, -3.0 / X)), 3.0);return p;}private:static const size_t M = N * X; //M为实际需要开的数据BitMap<M> _bm;
};

代码解释:

类模板定义:

N为传入的数据大小,X为倍数,用于求出M,K为模板类型,剩下的就是哈希函数。这里为了简单实现,就写死哈希函数,在实际实现中,哈希函数可以进行动态调整多少。

成员变量:

M需要开多少个比特位

_bm就是普通位图,因为布隆过滤器或许还是会转成int类型进行映射。我们这里直接套用即可。

Setsize_t x

使用多个哈希函数求出映射的位置,并调用_bm的函数set进行置1

Test(size_t x)

该函数为布隆过滤器核心,当有一个不在就是不在,这个是准确的。当全部在的时候可能在,这个是不准确的。

测试代码:

通过测试代码,就能很直观的看出,我们可以通过控制X(倍数)的大小,进行控制误判率。X越小误判率越大,X越大误判率越小。

布隆过滤器的实际应用:

布隆过滤器的优势(空间小、查询快、“不存在”判断准)使其非常适合用于需要快速过滤掉大量“肯定不存在”的请求的场景,尤其当数据量巨大且对少量误判可以容忍时:  

缓存穿透防护:  

问题:查询一个不存在的数据,导致请求绕过缓存直接冲击底层数据库(如Redis、MySQL)。  

解决:将所有可能存在的缓存键(或数据库主键)放入布隆过滤器。查询时先查布隆过滤器:

若返回“不存在”,则直接返回空或错误,避免查数据库。  

若返回“可能存在”,再去查缓存/数据库。即使有少量误判(查了数据库但没结果),也比所有不存在请求都查数据库要好得多。  

网络爬虫的URL去重:  

问题:避免重复抓取同一个URL。  

解决:将已抓取或计划抓取的URL放入布隆过滤器。

新URL来临时:  

查布隆过滤器:若返回“不存在”,则一定是新URL,加入抓取队列并添加到过滤器。  

若返回“可能存在”,则大概率是重复URL(即使有小概率误判是新URL,放弃抓取也是可以接受的代价)。  

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

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

相关文章

快速了解JVM中的深堆与浅堆

在Java虚拟机&#xff08;JVM&#xff09;的内存管理世界里&#xff0c;深堆与浅堆是两个重要的概念。它们如同衡量对象内存占用的两把标尺&#xff0c;对于优化程序性能、排查内存泄漏问题起着关键作用。接下来&#xff0c;让我们快速且深入地了解它们。 一、浅堆&#xff08…

开疆智能ModbusTCP转Devicenet网关连接FANUC机器人配置案例

本案例是ModbusTCP主站通过开疆智能ModbusTCP转Devicenet网关连接发那科机器人的配置案例&#xff0c;操作分为三个配置1&#xff1a;ModbusTCP主站配置2&#xff1a;ModbusTCP转Devicenet网关配置3&#xff1a;FANUC机器人配置&#xff0c;具体过程如下 配置过程 主菜单—IO—…

详解RabbitMQ高级特性之发送方确认机制

目录 发送方确认 添加配置 常量类 声明队列和交换机并绑定二者关系 confirm确认模式 编写生产消息代码 生产消息1 解决方法 多次生产消息2 解决方法 生产消息3 return 模式 编写生产消息代码&#xff08;路由正确&#xff09; 生产消息1 编写生产消息代码&…

Google Play开发者账号8.3/10.3政策违规自救指南

最近&#xff0c;有一位开发者焦急地向我们诉说&#xff0c;其辛苦开发的多个应用&#xff0c;毫无征兆地全部下架&#xff0c;账户提示违反政策 8.3 和 10.3。经过连夜排查&#xff0c;原来是换皮应用与误导性描述导致的问题。 这并非个例&#xff0c;在 2024 年&#xff0c;G…

pythonday50

作业&#xff1a; 1.好好理解下resnet18的模型结构 2.尝试对vgg16cbam进行微调策略 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torchvision import models from torch.utils.d…

天猫618高增长背后:电商迈入价值战新周期

作者 | 曾响铃 文 | 响铃说 这次618&#xff0c;来“真”的了。 天猫618玩法变得极致简单&#xff0c;只设了“官方立减”的85折的基础优惠&#xff0c;再叠加行业品类券、国补等优惠&#xff0c;最高立减可达50%&#xff0c;十分直观。 让消费者省心的结果也是显而易见的&…

tauri+vue自动更新客户端打包配置

拉取最新代码打开项目根目录下"~.tauri\myapp.key"文件并复制内容 打开项目的powershell窗口&#xff0c;输入如下内容并回车 $env:TAURI_SIGNING_PRIVATE_KEY"复制的myapp.key" $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD""然后修改tauri.conf.…

硬件------51单片机

一.基本概念 1.裸机程序 BSP BSP&#xff1a;bord suppord pack 板级支持包 就是程序编写的内容是没有操作系统的&#xff0c;直接通过代码去控制寄存器&#xff0c;让硬件按照要求去工作。 主要内容&#xff1a;51单片机 IMAX6ULL 2.linux驱动部分 在裸机BSP程序的基础…

java 基础方法 list分页

新增一个list 泛型分类方法 hutools没这个方法, mybatis 里面的方法不好用 故新增此方法 package com.common.base.util.page;import lombok.Data;import java.util.List;/*** className: VoPage* description: list分页* author: chenyuanlong* date: 2025年6月16日 0016 上午…

操作系统期末复习--操作系统初识以及进程与线程

操作系统概念与主要功能 操作系统的概念 在信息化时代&#xff0c;软件是计算机系统的灵魂&#xff0c;而作为软件核心的操作系统&#xff0c;已与现代计算机系统密不可分、融为一体。计算机系统自下而上大致分为4部分&#xff1a;硬件、操作系统、应用程序和用户 操作系统管…

使用jhat查看dump.hprof文件内具体对象的属性值信息

jhat是JDK自带的堆转储分析工具&#xff0c;可以用来查看.hprof文件中对象的具体内容。本文演示使用的是JKD8. 一、启动jhat 执行启动命令。 jhat -J-Xmx4g your_heap_dump.hprof -J-Xmx4g表示为jhat分配4GB内存&#xff0c;根据你自己情况调整大小。your_heap_dump.hprof是…

freeRTOS之队列(queue)

一.概述 1.介绍 队列(queue)可以用于"任务到任务"、“任务到中断”、"中断到任务"直接传输信息。 2.核心功能 线程安全&#xff1a;自动处理多任务访问时的互斥问题。 数据复制&#xff1a;入队时复制数据&#xff08;而非引用&#xff09;&#xff0c;…

【python】typing用法

一、基础类型提示 1. 基本类型注解 # 变量类型注解 age: int 30 name: str "Alice" is_student: bool False height: float 1.752. 函数注解 def greet(name: str, age: int) -> str:return f"Hello {name}, you are {age} years old!"二、组合类…

web前端开发核心基础:Html结构分析,head,body,不同标签的作用

前端技术协同关系 协作流程&#xff1a;HTML构建页面框架—>css美化样式&#xff08;选择器属性&#xff09;—>JavaScript实现交互&#xff08;类似于python的脚本语言&#xff09;扩展基础&#xff1a;在上面三项基础上学习Vue\React、构建工具WePack和浏览器工作原理…

精益数据分析(105/126):移动应用核心指标解析与用户分层营收策略

精益数据分析&#xff08;105/126&#xff09;&#xff1a;移动应用核心指标解析与用户分层营收策略 在移动应用市场竞争白热化的今天&#xff0c;单纯追求下载量已无法保证商业成功&#xff0c;精细化运营核心指标成为盈利关键。本文将深入解析每日活跃用户平均营收&#xff…

被CC攻击了,对服务器有什么影响?

博客正文&#xff1a; 最近&#xff0c;不少网站管理员和运维人员反映遭遇了CC攻击&#xff0c;导致服务器性能异常甚至瘫痪。那么&#xff0c;CC攻击究竟会对服务器造成哪些影响&#xff1f;本文将为你简要解析CC攻击的原理及其带来的危害&#xff0c;帮助你更好地理解并应对…

Tensorflow安装出现dependency conflict错误

Python版本&#xff1a; 3.11.4 pip版本已升到最新 电脑上有mac的原装Python2.x&#xff0c;我装的3.11.4&#xff0c;还有个什么依赖的3.9 运行 pip3 install tensorflow 出现类似以下错误 &#xff08;我报错的是另一个不是tensorflow—estimator&#xff0c;但基本就是…

2025年HTTP半开与错误攻击防御指南:原理拆解与实战防护

你以为限流就能防住HTTP攻击&#xff1f;黑客用协议畸形包AI调度正在撕裂传统防线&#xff01; 一、HTTP半开攻击&#xff1a;慢速绞杀服务器资源 ▶ 攻击原理剖析 HTTP半开攻击&#xff08;如Slowloris&#xff09;是一种应用层DoS攻击&#xff0c;通过建立大量半开连接耗尽…

Mybatis(XML映射文件、动态SQL)

目录 基础操作 准备&#xff1a; 删除&#xff1a; 新增&#xff1a; 更新&#xff1a; 查询&#xff1a; 条件查询&#xff1a; XML映射文件 动态SQL if foreach sql&include 基础操作 准备&#xff1a; 准备数据库表 创建一个新的springboot工程&#xff0…

python校园拼团系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…