惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Docker
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
The Hacker News
The Hacker News
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Scott Helme
Scott Helme
A
About on SuperTechFans
WordPress大学
WordPress大学
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
G
GRAHAM CLULEY
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - BigOrang

在vim中搜索关键字 linux top快捷键 druid 获取数据库连接失败,一直wait.DruidDataSource.takeLast -Xmx3G -Xms2G 在已经指定了最小内存2G后,启动的时候,就会直接分配2G给jvm吗 ?还是动态从1m到2G逐步分配的 java8类加载器示例&类加载1.8和1.8+的区别 windows查看端口占用 vmware Docker 设置代理 腾讯云域名托管到 cloudflare nginx 代理eureka后css/js/fonts无法访问 docker 基础镜像损坏 一起来找bug茬-01 mysql SHOW PROFILE 将所有容器docker都重启, 但是不重启mysql 正则 .*? 和 .* 的区别是什么 nginx打印所有配置内容 NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder kubesphere org.tmatesoft.svn.core.SVNException: svn: E160013: '/leifengyang/yygh-parent.git' path not found: 404 Not Found (https://gitee.com) linux中,使用alias, 应该在/etc/bashrc 中写,还是~/.bashrc中写,哪个更好 java date 时间最大连续天数
布隆过滤器原理及应用场景
BigOrang · 2024-03-27 · via 博客园 - BigOrang

布隆过滤器(Bloom Filter)是一种高效的数据结构,用于快速判断一个元素是否属于一个集合中(会有误判),它以极低的内存消耗和高效的查找速度而著称。

布隆过滤器的原理基于哈希函数和位数组。原理解释:

  1. 初始化:布隆过滤器由一个长度为 m 的位数组(bit array)和 k 个哈希函数(hash function)组成。初始时,位数组的所有位都被置为 0。

  2. 添加元素:当要向布隆过滤器中添加一个元素时,将该元素经过 k 个哈希函数计算得到 k 个哈希值(通常使用不同的哈希函数),然后将位数组中对应位置的位设置为 1。

  3. 查询元素:当要查询一个元素是否存在于布隆过滤器中时,同样将该元素经过 k 个哈希函数计算得到 k 个哈希值,然后检查位数组中对应位置的位是否都为 1。如果有任何一个位置的位为 0,那么该元素一定不存在于布隆过滤器中;如果所有位置的位都为 1,那么该元素可能存在于布隆过滤器中(存在一定的误判率)。

  4. 哈希函数:哈希函数是布隆过滤器的关键。它们负责将输入的元素映射到位数组的不同位置上。通常使用多个不同的哈希函数来增加散列的随机性。常用的哈希函数包括 MurmurHash、FnvHash、SHA 等。

  5. 误判率:布隆过滤器的一个重要性能指标是误判率。误判率取决于位数组的长度 m、哈希函数的数量 k,以及添加到布隆过滤器中的元素数量。增加位数组的长度和哈希函数的数量可以降低误判率,但会增加内存消耗。

需要注意的是,布隆过滤器在判断一个元素存在时可能会有一定的误判率。这是因为多个元素经过哈希函数计算得到的哈希值可能产生冲突,导致多个元素对应的位数组位置被设置为 1。因此,在使用布隆过滤器时,需要根据具体应用场景和需求来权衡误判率和内存消耗,以确保在可接受的误判率范围内使用。

以下是一些常见的布隆过滤器的应用场景:

  1. 缓存系统:布隆过滤器可以用于快速判断一个元素是否存在于缓存中,从而避免不必要的查找操作。例如,在一个网页缓存系统中,当用户请求一个网页时,可以先使用布隆过滤器判断该网页是否已经被缓存,如果不存在,则进行后续的缓存查找和更新操作。

  2. 大数据处理:在处理大规模数据时,布隆过滤器可以用于快速过滤掉不可能存在的数据,从而减少实际查询的开销。例如,在网络爬虫中,可以使用布隆过滤器来过滤已经访问过的 URL,避免重复访问。

  3. 数据库查询优化:在某些情况下,可以使用布隆过滤器来减少数据库查询的开销。例如,在一个用户系统中,可以使用布隆过滤器来判断一个用户是否存在于数据库中,如果不存在,则无需进行实际的数据库查询操作。

  4. 防止缓存击穿:布隆过滤器可以用于防止缓存击穿的情况发生。当某个热点数据失效时,如果使用布隆过滤器判断该数据是否存在,如果不存在,可以快速返回避免对底层存储系统的过度访问,同时可以异步更新缓存。

  5. 恶意网址过滤:布隆过滤器可以用于恶意网址过滤,以防止用户访问已知的恶意或危险网址。通过将恶意网址添加到布隆过滤器中,可以在用户访问时迅速判断该网址是否应该被阻止。

需要注意的是,布隆过滤器在判断一个元素不存在时是100%准确的,但在判断一个元素存在时可能会有一定的误判率

这是因为布隆过滤器使用了哈希函数和位数组来表示数据集合,可能存在哈希冲突导致误判。因此,在应用布隆过滤器时需要权衡误判率和内存消耗,确保在可接受的误判率范围内使用。