布隆过滤器及其应用

这篇具有很好参考价值的文章主要介绍了布隆过滤器及其应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是布隆过滤器?

布隆过滤器是一种数据结构,具有快速插入和查找的特性,能确定某个字符串一定存在或者可能存在。布隆过滤器有着高效的空间利用率,它不存储具体数据,只存储数据的关键标识,所以占用的空间较小。它的查询结果可能会存在一定误差,但是误差总体可控,同时不支持删除操作。布隆过滤器的应用场景丰富,在任何仅需要知道数据是否存在,并不关心具体数据内容的场景都可以使用布隆过滤器,例如在网页爬虫中URL去重防止重爬、可以应用在缓存系统中,避免缓存穿透等问题、在安全领域,也可以使用它来快速判断一个请求是否属于黑名单ip,防止恶意攻击等。
布隆过滤器拥有的快速插入和查找的特性是否很像散列表?普通散列表一般依赖数组实现,而布隆过滤器为了节省空间,使用的Bitmap结构,即位图。

位图

位图本质上其实也是散列表的一种实现,不同的是位图节省空间体现在它利用二进制位存储数据状态。我们知道在ASCII编码中,一个英文字符占用一个字节(Byte),也就是8位(bit)。若是UTF8编码,中文或者特殊字符可能会占用更多字节。例如存在一个数组如下:

  Integer[] array = new Integer[5]{0,1,3,5,7};

以上的数组中,不考虑数组对象本身占用的空间,只计算元素空间,每个元素若只占8位,存储这5个元素就要占用40位。假如用二进制位存储这5个元素,则只需要8位即可。

如上图,对应槽位的二进制位中,0代表不存在元素,1表示存在元素,当我们需要查询是否存在某个数字时,只需要看对应槽位的值是不是1即可,这样只需要一个8位空间即可表示0,1,3,5,7这几个元素了。

布隆过滤器的原理

上面说过,布隆过滤器是依赖位图实现的,它的原理是在位图的基础之上,定义了若干个散列函数。当需要向布隆过滤器中插入数据时,首先利用这几个散列函数分别计算出散列值,并且将位图上对应槽位的值设置成1,如果已经是1的话就不做任何操作。需要检查某个数据是否存在时也是同理,计算出要检查的数据的多个散列值,并且检查位图中对应槽位是否全都为1,但凡有一位不为1就可以断定值不存在,都为1的话值可能存在。

为什么是可能存在呢?随着计算的数据越来越多,查询的结果也会慢慢出现一定几率误差。因为散列函数存在结果碰撞的问题,两个不同的值通过散列函数计算出的结果有概率相同。所以当某个值即便从来没有被插入过,通过这多个散列函数计算的出的槽位也可能和之前值相同,所以会误判为已存在。为了降低误差几率,需要按照具体需求调整散列函数的算法\个数和位图大小,确保通过散列函数计算出来的槽位足够均匀分布到位图上。
布隆过滤器不支持删除操作,是因为在位图中每个槽位只存在两种状态,即0和1。一个槽位被设置为1,但无法确定它被多少个关键字,通过哪些散列函数设置了多少次1,只知道它被置为了1,所以无法删除。

布隆过滤器的应用

Google提供的guava工具里面包含了布隆过滤器的实现。

<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>30.0-jre</version>
		</dependency>
  public static void main(String[] args) {
        Integer size = 1000000;
        BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), size, new Double(0.001));

        for (Integer i = 0; i < size; i++) {
            bloomFilter.put(String.valueOf(i));
        }

        Integer count = 0;
        for (Integer i = size; i < size * 2; i++) {
            if (bloomFilter.mightContain(String.valueOf(i))) {
                count++;
            }
        }

        System.out.println("误判率:" + count / new Double(size));
    }
误判率:0.00101

Process finished with exit code 0

测试结果和我们配置的参数大致吻合。

缓存穿透问题的产生,是当有大量的恶意流量去请求系统中不存在的数据时,缓存中没有对应数据,导致请求直接去查数据库,使数据库承受压力。而将布隆过滤器放在缓存之前则可以避免此问题,每当有流量来请求数据时会先在布隆过滤器中查询,请求是否是系统中的正常数据,如果是则放行流量去查缓存或数据库,否则直接忽略请求或者执行其他处理策略。

本文首发自Eric's Blog,转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-776930.html

到了这里,关于布隆过滤器及其应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 哈希的应用【布隆过滤器】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎃操作环境: Visual Studio 2022 版本 17.6.5 注册账号是进行网络冲浪的第一步操作,而拥有一个具有个性且独一无二的用户昵称是非常重要的,很多人在填写昵称时,常常会看到 此昵称已存在 的提示,系统是如何快速知道当前昵称

    2024年02月14日
    浏览(43)
  • C++哈希应用——位图布隆过滤器

    用哈希表存储用户记录,缺点是需要消耗较大的内存;用位图存储用户记录,缺点是位图一般处理整形,内容是字符串或者自定义类型就很勉强。基于以上,若将哈希和位图结合,称为布隆过滤器,会不会把上面的问题都解决了呢? 概念 布隆过滤器是一种概率型数据结构。

    2024年02月04日
    浏览(53)
  • 【C++】哈希的应用——布隆过滤器

    我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的? 用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选

    2023年04月22日
    浏览(86)
  • 【C++】哈希应用之布隆过滤器

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》 《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.布隆过滤器的提出 2.布隆过滤器的概念 3.布隆过滤器的模拟实现 3.1布隆

    2024年03月27日
    浏览(37)
  • 哈希的应用--位图和布隆过滤器

    位图(Bitset)是一种数据结构,用于表示一组布尔值,其中每个元素通常对应于一个位或一个二进制值,可以存储0或1。位图在计算机科学和计算机工程中经常用于各种应用,特别是在位级别的标志、掩码和快速查找中。以下是位图的一些关键特点: 二进制表示 :位图中的每

    2024年02月08日
    浏览(52)
  • [C++]哈希应用之位图&布隆过滤器

               主厨:邪王真眼 主厨的主页:Chef‘s blog   所属专栏:c++大冒险        我们之前学习了哈希表,哈希表通过映射关系,实现了O(1)的复杂度来查找数据,哈希在实践中是一个非常重要的思想,今天要学习的就是哈希思想的两大应用:位图与布隆过滤器 给 40 亿个

    2024年04月15日
    浏览(40)
  • 【C++】哈希应用:位图 哈希切分 布隆过滤器

    我走后,他们会给你们加班费,会给你们调休,这并不是他们变好了,而是因为我来过。------龙哥 1. 大厂经典的面试题,给你40亿个不重复的无符号整数,让你快速判断一个数是否在这40亿个数中,最直接的思路就是遍历这40亿个整数,逐一进行比对,当然这种方式可以倒是可

    2023年04月09日
    浏览(41)
  • 哈希的应用 -- 布隆过滤器与海量数据处理

    布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,以用来告诉你 “ 某样东西一定不存在或者可能存在 ”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也

    2024年02月02日
    浏览(44)
  • C++ 哈希思想应用:位图,布隆过滤器,哈希切分

    1.问题 给你40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中? 2.分析 1 Byte = 8 bit 1KB = 1024 Byte 1MB = 1024KB = 1024 1024 大约= 10的6次方Byte 1GB = 1024MB = 1024 10的6次方 大约= 10的9次方Byte = 10亿字节 因此4GB 约等于40亿字节 其实最快的方式就是

    2024年04月17日
    浏览(49)
  • 【C++学习】哈希的应用—位图与布隆过滤器

    文章简介 : 在这篇文章中,你会学习到关于哈希思想的最常见的两个应用,也就是 位图 与 布隆过滤器 , 文章会讲解位图和布隆过滤器的概念,底层实现,对应的适应的场景,以及相关经典 海量数据面试题 及解析。 所谓位图,就是用每一位来存放某种状态,适用于 海量

    2024年04月14日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包