布隆过滤器简述【Guava实现】

news/2025/3/6 19:52:45/文章来源:https://www.cnblogs.com/sansWL/p/18753062
  1. 简述:

布隆过滤器是一种利用对象表示,通过插入自定义缓存判断对象是否存在、不存在的技术;

  1. 举例,已Guava工具包中的布隆为例
       <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId></dependency>

在Guava工具包中实现的布隆过滤器,利用hash处理对象得出对应的hashcode,将hashcode存入一个
long当中;Guava工具包中的布隆过滤器没有扩容、删除处理,推荐创建时选择大于当前对象集2倍以上容量;

当新对象通过hash算出新的值后,与当前的Long进行位与操作,如果位置已经是1经过与操作不变,0转变为1
如果存在0转变为1,表明这个对象是一个新的对象,没有被缓存过(即之前不存在的对象)

  1. 缺点
  1. 经过上述简介,我们知道guava实现的布隆过滤器存放在一个long下,现在假使这个缓存不会扩容的情况下,当存入的对象越来越多后,long的所有位都会变为1,此时过滤器完全失去作用,会判断所有对象存在;
  2. 假使两个对象存入long后刚好占据后4位,将后4位转变为1,这时一个新对象经过hash后需要转变long的后4位为1,这时同样会判为已存在,即 1+3 = 4,所以布隆过滤器判断已存在的对象不可信,即不存在的一定不存在,存在的不一定存在
  3. 扩容问题,当过滤器中位为1的位越来越多后,布隆过滤器得出的结果就越会失真,使用扩容增加0位可以提高准确率,但是使用扩容方案,扩容前的对象由于存在多个对象混合插入的情况(即同一个1 会代表多个对象),扩容后的缓存如何恢复扩容前缓存的记录。可以采取废弃旧布隆直接创建新布隆处理(需要缓存的对象是被持久化的),提高可用性的话可以考虑多个过滤器混合构成,当前一个不够用直接创建一个新的,拿前一个+后一个得出的结果作为最终结果
  4. 删除问题,类似扩容即同一个1会代表多个对象,经过hash后无法准确的只删除当前对象的1,可以使1增加计数器处理,当删除操作发生时,如果计数器存在值,优先减去计数器的值;
  1. 源码阅读
//先空着

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

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

相关文章

React18 01 工程化/组件化开发

如果通过yarn安装,则将package.lock.json与node_modules两个文件删除,用yarn重新安装。 vue脚手架搭建项目后默认安装vue在包中,而React不止至于react~打包命令browserslit的作用脚手架的进阶应用 如果操作eject命令,可以暴露配置项修改源码,但是是不可逆的操作,项目文件…

Dubformer 获 360 万美元融资,情感迁移技术革新 AI 配音;全球首款宠物智能手机亮相:可定位、AI 实时通话丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

[编程笔记] ant-design中ProLayout组件左侧菜单数据刷新问题

最近在做1个React项目,用的ant-design,由于以前没有学过React,最近几个月属于边学边干的状态了(0基础直接上手可还行)很坑的一个bug,setProcessedRoutes([processedRoutes]) 的时候,左侧菜单没有自动更新,问了下AI,在多个结果中,用setProcessedRoutes([...processedR…

三菱机器人示教器跳屏故障分析维修

跳屏故障原因分析三菱机器人示教器跳屏故障可能由以下原因导致: 电源故障:电源不稳定或电源线接触不良可能引起跳屏。信号干扰:工作环境中的电磁干扰,如大功率电器或高压线,可能导致跳屏。软件问题:示教器软件故障或版本不兼容可能导致跳屏。硬件故障:显示屏本身故障、排…

『Python底层原理』--异步机制(async/await)

在现代编程中,并发是提高程序效率的关键技术之一,它允许程序同时执行多个任务,充分利用系统资源。 本文将深入探讨 Python 中的async/await机制,从并发编程基础讲起,逐步剖析其工作原理和实现方式。 1. 并发编程基础 计算机程序的执行方式主要有两种:顺序执行和并发执行。…

bbox.exe WriteUp

WriteUp 题目信息 名称:bbox.exe 分类:Reverse 描述:找到程序的flag题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5解题思路 首先用DIE分析文件的结构,发现这是一个无壳的32位程序。于是直接用32位IDA打开该文件进行反汇编,得到如下情…

Deepseek-R1模型部署

一、每个客户端需要单独配置API版 前置条件: 1、英伟达的显卡 2、安装Ollama工具 3、Deepseek模型 4、Chatbox 部署Deepseek模型后使用Chatbox设置模型API即可使用缺点:需要在每台客户端都需要输入API,需要安装Chatbox软件 二、一次性配置API版本 前置条件: 1、英伟达的显卡…

学习理论:单阶段代理损失的(H, R) - 一致界证明

我们在上一篇博客中介绍了弃权学习的基本概念和方法,其中包括了针对多分类问题的单阶段预测器-拒绝器弃权损失L_{abst}。设l为在标签Y上定义的0-1多分类损失的代理损失,则我们可以在此基础上进一步定义弃权代理损失L。在上一篇博客中,我们还提到了单阶段代理损失满足的(H, R…

element组件学习

vite.config.js点击查看代码 import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from @vitejs/plugin-vue import vueDevTools from vite-plugin-vue-devtools import AutoImport from unplugin-auto-import/vite import Components f…

SpringCloud学习-熟悉docker

前言:本人练习使用的是阿里云服务器,配置为:一:配置docker镜像加速 由于docker自带的镜像仓库地址速度很慢,甚至国内访问不了,所以需要做下镜像加速设置: # 创建目录 mkdir -p /etc/docker# 复制内容 tee /etc/docker/daemon.json <<-EOF {"registry-mirrors…

IntelliJ IDEA 激活码,免费不收费

IntelliJ IDEA 2020、2021、2022、2023、2024 通用激活,免费激活码,激活码实时更新IntelliJ IDEA 2020、2021、2022、2023、2024通用激活,激活码实时更新 激活码获取方式:扫描关注公众号,回复:激活码 【激活码会即时更新,过期后请重新获取】分享不易,赠人玫瑰,手有余香…

c语言实验1

一、实验目的会使用C语言程序开发环境(vs2010/devc++等),能熟练、正确使用它们编写、编译、运行、调试C程序 知道C程序结构和编码规范,能正确使用 能正确、熟练使用C语言输入输出函数: scanf() , printf() , getchar() , putchar() 能灵活、组合使用基本数据类型、运算符和…