我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是布隆过滤器?你学会了吗?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是布隆过滤器?你学会了吗?

在对响应时间要求比较严格的情况下,如果我们有里面,那么随着集合中元素数量的增加,我们需要的存储空间越来越大,检索时间也越来越长,导致内存过多开销和时间效率变低。

这时候需要考虑的问题是,在数据量比较大的情况下,既能满足时间要求,又能满足空间要求,所以我们需要一种时间和空间消耗都比较小的数据结构和算法。布隆过滤器是一种解决方案。

什么是布隆过滤器?

Bloom Filter, 布隆过滤器由 Bloom于 1970 年提出。它实际上是一个长二进制向量和一系列随机映射函数, 布隆过滤器可用于检索元素是否在集合中。其优点是空间效率和查询时间远超一般算法,缺点是存在一定的误识别率和删除难度。根据它的特性,应用场景有如下:

  • 爬虫过滤。
  • 邮箱垃圾邮件过滤。
  • 黑名单过滤。
  • 大数据去重。
  • 防止缓存穿透。

布隆过滤器原理

布隆过滤器的原理是当一个元素加入到集合中时,通过K个哈希函数将该元素映射到一个位数组中的K个点,并将它们置为1。检索时,我们只需要看这些点是否都为1,就可以(大概)知道它是否存在于集合中。如果这些点中的任何一个有0,则检查的元素一定不存在。如果它们都是1,则被选中的元素很可能在那里。

Bloom Filter与单一哈希函数Bit-Map的区别在于,Bloom Filter使用k个哈希函数,每个字符串对应k个bits,从而降低碰撞概率。

由于Bloom filter只存储0和1而不存储具体值,所以在一些机密场合具有先天优势。位图的每一位都是一个位,所以通过位图有10亿个位置,位图的大小为0.12G,插入和查询的时间复杂度为O(k),k是哈希函数的个数。

布隆过滤器的问题

布隆过滤器之所以能够在时间和空间上取得比较高的效率,是因为它牺牲了判断的准确性和删除的便利性。

  1. 判断错误

有可能要找的元素不在容器中,但是散列后得到的k个位置都是1。如果布隆过滤器中存储了黑名单,则可以通过创建白名单来存储可能被误判的元素。

对于这个问题,可以通过增加位图数组的大小(位图数组越大,占用的内存越大)和减少哈希冲突来解决。但缺点是会增加占用的内存空间。

另一种解决方案是增加散列函数的数量并减少散列冲突。如果同一个键值等于一个函数,经过两个或多个哈希函数得到相等结果的概率自然会降低。然而,这会导致计算效率的降低,因为时间复杂度退化为O(hash times)。

  1. 难以去除

放置在容器中的元素映射到位数组的 k 个位置中的 1。删除的时候不能简单的直接设置为0,这样可能会影响其他元素的判断。你可以使用​​Counting Bloom Filter​​来解决这个问题。

Java中如何使用布隆过滤器

google的guava就提供了这样的API.

<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>22.0version>
dependency>

编写测试代码

import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class GuavaBloomFilter {
public static void main(String[] args) {
int total = 1000000;
// default false positive ratefpp0.03
// fpp:There will always be a false positive rate in a Bloom filter
// Because hash collisions are impossible to avoid 100%.
// Bloom filter calls this misjudgment rate false positive probability,abbreviated as fpp
BloomFilter<CharSequence> bf = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total);
// Initialize the total bar data into the filter
for (int i = 0; i < total; i++) {
bf.put("" + i);
}
// Determine whether the value exists in the filter
int count = 0;
for (int i = 0; i < total + 10000; i++) {
if (bf.mightContain("" + i)) {
count++;
}
}
System.out.println("Matched quantity " + count);

// Specified misjudgment rate: 1/10,000 to improve matching accuracy
BloomFilter<CharSequence> bfWithFpp = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), total, 0.0001);
for (int i = 0; i < total; i++) {
bfWithFpp.put("" + i);
}
int countFpp = 0;
for (int i = 0; i < total + 10000; i++) {
if (bfWithFpp.mightContain("" + i)) {
countFpp++;
}
}
//The smaller the value of the false positive rate fpp
// the higher the matching accuracy.
// When the value of the false positive rate fpp is reduced
// the storage space required is also larger
// Therefore, in actual use,
// a trade-off needs to be made between the false positive rate and the storage space.
System.out.println("The specified false positive rate has matched the number " + countFpp);// (1000001 - 1000000)/(1000000 + 10000) * 1000.0001
}
}


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是布隆过滤器?你学会了吗?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

什么是布隆过滤器?你学会了吗?

在对响应时间要求比较严格的情况下,如果我们有里面,那么随着集合中元素数量的增加,我们需要的存储空间越来越大,检索时间也越来越长,导致内存过多开销和时间效率变低。

布隆过滤器,你用对了吗?

布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。

什么是布隆过滤器?如何实现布隆过滤器?

以下我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?

什么是布隆过滤器?

布隆过滤器是一种基于哈希函数的概率性数据结构,用于判断元素是否属于给定集合。其原理是将元素映射到位数组中,并通过查询这些位置来判断元素是否可能存在于集合中。布隆过滤器以其空间效率和快速查询著称,广泛应用于网络安全、缓存系统和数据库等领域。其缺点是可能出现假阳性,但可以通过调整其参数来控制假阳性率。扩展版本的布隆过滤器,如可计数布隆过滤器和局部敏感哈希布隆过滤器,可用于解决特定问题,如近似最近邻搜索和动态集合维护。
什么是布隆过滤器?
2024-04-02

你了解布隆过滤器的“大家族”吗?

布隆过滤器(Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。

Java中的布隆过滤器你真的懂了吗

经常会听到大家说起布隆过滤器,但是很多人都只是听过名字,却并不知道其是怎么实现的。下面将详细介绍一下布隆过滤器,并且使用简单的代码演示
2023-05-18

Java中的布隆过滤器,你知道吗?

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

redis布隆过滤器的作用是什么

Redis布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。它可以高效地判断一个元素是否可能在集合中,但无法确保元素一定在集合中或者排除元素已经在集合中。布隆过滤器通常用于减少对数据库的查询次数,节省资源和时间。常见的应用
redis布隆过滤器的作用是什么
2024-04-09

redis布隆过滤器的工作原理是什么

Redis布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。它基于位数组和多个哈希函数实现。工作原理如下:初始化:布隆过滤器包含一个位数组,所有位都初始化为0。同时,需要选择合适数量的哈希函数和哈希函数的种子。添加元素
redis布隆过滤器的工作原理是什么
2024-04-09

牛哄哄的布隆过滤器,有什么用?

日常开发中,大家经常使用缓存,但是你知道大型的互联网公司面对高并发流量,要注意缓存穿透问题吗?

Redis布隆过滤器大小的算法公式是什么

今天小编给大家分享一下Redis布隆过滤器大小的算法公式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 简介客户端
2023-06-29

什么是线程组?你学会了吗?

线程组的出现更多的是便于有组织的管理线程,比如 Java 的线程池就用到了线程组,更多的线程知识,我们在后续的文章中会进行介绍。

DHCP Option 43是什么?你学会了吗?

option 43是一个自定义选项,用于表示AC IP地址。AP通过DHCP的option 43字段,获取AC IP地址信息,再发送单播报文找到对应AC,实现AP的零配置上线。这里说的AP,都是指FIT AP。
option43FITAP2024-12-01

装饰器是怎么实现的?你学会了吗?

解释器还是从上到下解释,当执行到 @deco1 的时候,肯定要装饰了,但它下面不是函数,也是一个装饰器,于是表示:要不哥们,你先装饰。然后执行 @deco2,但它下面还是一个装饰器,于是重复了刚才的话,把皮球踢给 @deco3。

聊聊宽表为什么横行?你学会了吗?

宽表的目的是为了解决BI查询性能和前端工程实现问题,而宽表会带来数据冗余和灵活性差等问题。通过SPL的实时关联技术与高效存储可以解决性能问题,而且性能比宽表更高,同时不存在数据冗余,存储空间也更小(压缩);DQL构建的语义层解决了多维分析前

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录