首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

哈希应用——布隆过滤器

因为位图里面的元素映射其实就是下标嘛,而下标的话都是整型啊。 那有没有什么 办法可以解决呢? 这就是我们今天要学布隆过滤器(Bloom Filter) 1....此种方式不仅可以提升查询效率,也可以节省大量内存空间。 那接下来我们就来详细讲解一下布隆过滤器 3. 布隆过滤器插入 上面提到布隆过滤器其实就是用哈希函数把数据映射到位图结构。...那有没有什么办法能让他支持删除呢?...除此之外还存在一个问题: 就是我们查找一个元素时候无法确认该元素是否真的存于布隆过滤器。...、并、差运算 布隆过滤器缺陷 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合(补救方法:再建立一个白名单,存储可能会误判数据) 不能获取元素本身 一般情况下不能从布隆过滤器删除元素

17210

白话布隆过滤器

所谓布隆过滤器,是由一个名叫布隆的人提出:当一个元素被加入集合时,通过多个哈希函数将元素映射到一个比特数组若干个位置,并把它们置为 1 ,查询时,只要看看这些位置是不是都是 1 就知道元素是否(可能...Bloom filter 如上图所示,字符串「Hello」被哈希函数映射到比特数组索引 1 和 3 位置,布隆过滤器就会把这些位置置为 1;字符串「Bloom」被哈希函数映射到比特数组索引 1 和...好消息是问题不大,布隆过滤器使用是多个哈希函数,查询时,必须所有的哈希函数映射索引位置都确认才行;坏消息是如果比特数组长度不够大,那么随着新元素不断加入,比特数组大部分索引位置都会被置为 1,...,在 wiki 给出了计算方法,本文省略证明过程,直接给出结论:「k = (m/n) ln2」,其中:k 是哈希函数个数;m 是比特数组大小;n 是过滤器元素数量;ln2 约等于 0.693:...如果比特数组大小是过滤器元素数量 6 倍(也就是 m/n = 6),那么哈希函数数量为 4(实际为 4.16 四舍五入)时候,误报率(5.61%)相对较低。

23920
您找到你想要的搜索结果了吗?
是的
没有找到

10亿+超链接,如何防止重复爬取?

前段时间领导给了一个任务:编程实现对一个指定论坛舆情监控,在所有帖子找出含有公司相关名称帖子,查看是否不良言论,防止舆情风险。...位图是很常用数据结构,通常基于数组来实现,数组每个元素可以看成是一系列二进制数,所有元素组成更大二进制集合。...如果要对某个二进制位上操作,则要先获取到操作数组第几个元素,再获取相应位索引,然后执行操作。你可搜索关键词[Python 位图]来查询位图是如何编码实现,不再赘述。...虽然内存占用问题解决了,但是随着 URL 数量增多,内存占用还是会线性增加,就算使用位图操作,100 亿个 URL 仍然要使用 1200 MB 内存,有没有办法使内存占用成为一个固定值?...总结: 关于搜索引擎爬虫网页去重问题解决,哈希表到位图,再到布隆过滤器,每一步都有很大空间占用优化。布隆过滤器非常适合这种不需要 100% 准确、允许存在小概率误判大规模判重场景。

1.4K10

品味布隆过滤器 Bloom filter设计之美

2 原理解析 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数。 布隆过滤器可以用于检索一个元素是否在一个集合。...布隆过滤器原理:当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组 K 个点,把它们置为 1。...1、缓存穿透场景 首先我们需要初始化布隆过滤器然后当用户请求时,判断过滤器是否包含该元素,若不包含该元素,则直接返回不存在。...图片 定时任务触发全量商品查询 ; 将商品编号添加到新布隆过滤器 ; 任务完成,修改商品布隆过滤器映射旧 A 修改成 新 B ); 商品服务根据布隆过滤器映射,选择新布隆过滤器 B进行相关查询操作...5 总结 布隆过滤器是一个很长二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合

2.1K41

一个令人惊艳算法——布隆过滤器

概述 布隆过滤器(Bloom Filter)是1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数,布隆过滤器可以用于检索一个元素是否在一个集合。...不过还有一种叫作散列表(又叫哈希表,Hash table)数据结构,它可以通过一个Hash函数将一个元素映射成一个位阵列一个点,这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。...对于有n个元素集合S={s1,s2......sn},通过k个映射函数{f1,f2,......fk},将集合S每个元素sj(1<=j<=n)映射为k个值{g1,g2......gk},然后再将位数组...布隆过滤器不需要存储元素本身,在某些对保密要求非常严格场合有优势。 ? 布隆过滤器缺点 但是布隆过滤器缺点和优点一样明显。误算率是其中之一。随着存入元素数量增加,误算率随之增加。...但是如果元素数量太少,则使用散列表足矣。 另外,一般情况下不能从布隆过滤器删除元素. 我们很容易想到把位数组变成整数数组,每插入一个元素相应计数器加 1, 这样删除元素时将计数器减掉就可以了。

4K42

内存崩溃了?其实你只需要换一种方式

那我们在不使用数据库情况下有没有解决办法呢?布隆过滤器!它就可以完美解决这个问题,布隆过滤器有什么特殊地方呢?接下来就一起来学习一下布隆过滤器。...什么是布隆过滤器 布隆过滤器是一种数据结构,比较巧妙概率型数据结构,它是在 1970 年由一个名叫布隆提出,它实际上是由一个很长二进制向量和一系列随机映射函数组成,这点跟哈希表有些相同,但是相对哈希表来说布隆过滤器它更高效...布隆过滤器只能告诉你某个元素一定不存在或者可能存在在集合, 所以布隆过滤器经常用来处理可以忍受判断失误业务,比如爬虫 URL 去重。...最常见解决办法就是采用布隆过滤器,将所有可能存在数据哈希到一个足够大bitmap,一个一定不存在数据会被这个bitmap拦截掉,从而避免了对底层存储系统查询压力。...,防止 url 重复采集,这也是我们这篇文章重点讲解内容 垃圾邮件识别 数十亿个垃圾邮件列表判断某邮箱是否垃圾邮箱,将垃圾邮箱添加到布隆过滤器然后判断某个邮件是否是存在在布隆过滤器,存在说明就是垃圾邮箱

47910

布隆过滤器,一文总结快速掌握,你能够get多少?

针对此,布隆过滤器应运而生了。 二、布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数。...这个数组里面存放值要么是0,要么是1。 映射函数,它可以将一个元素映射成一个位阵列(Bit array)一个点。所以通过这个点,就能判断集合是否有此元素。...只存储0和1,不需要存储元素本身,在某些对保密要求非常严格场合有优势。 缺点 存在误差率。随着存入元素数量增加,误算率随之增加。...万个元素都匹配上了;不存在布隆过滤器1千个元素,有23个误判。...万个元素都匹配上了;不存在布隆过滤器1千个元素,有10个误判。

1.2K10

使用布隆过滤器求两个大文件交集

要求找出A和B共同url。常规方法及不足最简单方法是将A和B分别载入内存,然后逐一比对找出交集。但每个文件达到320GB,远超过4G内存限制,无法操作。...先分别对A和B进行排序,然后归并式地求交集。此方法需要多轮磁盘IO,在数据规模巨大时同样低效。布隆过滤器解法基于上述分析,需要一种能够快速判断元素是否在集合数据结构。...,则输出 } } }}这个示例先初始化了两个布隆过滤器,然后分别加载两个文件url,最后判断文件Burl是否在过滤器A,从而找出交集。...判断不存在元素时,可能会产生少量误判布隆过滤器原理是,使用多个随机映射函数将元素映射到一个位向量,判断元素是否在集合时,检查它在位向量位置是否都为1。...算法实现基于布隆过滤器,可以设计一个求两个文件交集算法:根据文件A数据规模和可接受误判率,初始化布隆过滤器A;遍历文件A,将每个url输入到过滤器A;同样初始化过滤器B,遍历文件B将元素输入过滤器

38530

java面试题 --- Redis②

优点就是每个 Redis 实例之间没有关联,容易线性扩展,缺点就是 Redis 实例一旦增加,key 映射规则就需要改。 基于代理分片:客户端请求都发到代理,代理再去判断要发往哪台节点。...具体流程: 先删 Redis 数据; 然后更新数据库; 线程休眠一段时间; 再删 Redis 数据; 休眠一段时间再删目的是,假如请求 A 进来先删了 Redis 数据,然后再还没来得及更新数据库时候...解决办法是做好参数校验,非法请求直接挡掉;用布隆过滤器,将数据库数据缓存到布隆过滤器,请求数据库之前先判断布隆过滤器有没有,没有就直接挡掉。 ---- 8. 什么是缓存击穿?如何解决?...缓存击穿就是同时大量请求 Redis 没有的一个 key,所有这个 key 请求都落到数据库,导致数据库崩掉。解决办法就是用布隆过滤器,设置热点数据永不过期等。 ---- 9....如何在一亿个 key 找出指定前缀 key?

27420

Redis之布隆过滤器(Bloom Filter)解读

这种思路对于数据量小项目来说是没有问题,但是对于大数据量项目,如,垃圾邮件出现有十几二十万,恶意ip地址出现有上百万,或者几十亿电话检索出指定电话是否在等操作,那么这十几亿数据就会占据大几...隆过滤器定义 布隆过滤器(Bloom Filter)是1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合。...隆过滤器原理  当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array) K 个点,把它们置为 1。...当实际元素数量超过初始化数量时,应该对布隆过滤器进行重建,重新分配一个 size更大过滤器,再将所有的历史元素批量add进行 布隆过滤器优缺点 优点:高效插入和查询,内存占用空间少。...比如:识别垃圾邮件,只要是邮箱在黑名单邮件,就识别为垃圾邮件 假设黑名单数量是数以亿计,存放起来就是非常耗费存储空间,布隆过滤器则是一个较好解决方案 把所有黑名单都放在布隆过滤器,在收到邮件时

29550

Redis布隆过滤器原理与实践

不过还有一种叫作散列表(又叫哈希表,Hash table)数据结构,它可以通过一个Hash函数将一个 元素映射成一个位阵列一个点,这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。...原理 当一个元素加入布隆过滤器时候,会进行如下操作: 使用布隆过滤器哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)。...当我们需要判断一个元素是否存在于布隆过滤器时候,会进行如下操作: 对给定元素再次进行相同哈希计算; 得到值之后判断位数组每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器, 如果存在一个值不为...1,说明该元素不在布隆过滤器。...爬虫/ 邮箱等系统过滤:平时不知道你有没有注意到有一些正常邮件也会被放进垃圾邮件目录,这就是使用布隆过滤器 误判 导致。 Google Chrome 使用布隆过滤器识别恶意 URL。

31030

什么是布隆过滤器?如何使用?

通常你判断某个元素是否存在用是什么? 很多人想到是HashMap。 确实可以将值映射到 HashMap Key,然后可以在 O(1) 时间复杂度内返回结果,效率奇高。...布隆过滤器可以用于检索一个元素是否在一个集合 如果想判断一个元素是不是在一个集合里,一般想到是将集合中所有元素保存起来,然后通过比较确定。...布隆过滤器原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组K个点,把它们置为1。...三、布隆过滤器应用 在实际工作,布隆过滤器常见应用场景如下: 网页爬虫对 URL 去重,避免爬取相同 URL 地址; 反垃圾邮件,数十亿个垃圾邮件列表判断某邮箱是否垃圾邮箱; Google Chrome...缺点 但是布隆过滤器缺点和优点一样明显。误算率是其中之一。随着存入元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。 另外,一般情况下不能从布隆过滤器删除元素

2.4K52

海量数据处理利器之布隆过滤器

它实际上是由一个很长二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合。...对于有n个元素集合S={s1,s2......sn},通过k个映射函数{f1,f2,......fk},将集合S每个元素sj(1<=j<=n)映射为k个值{g1,g2......gk},然后再将位数组...尤其要注意是,布隆过滤器是不允许删除元素(实际就是因为多个str可能都应设在同一点,而判断str存在的话是所有映射点都存在,所以不能删除),因为若删除一个元素,可能会发生漏判情况。...然后再取f2内容读入内存。。。依次类推,知道找出所有的重复url。       第二种:如果允许一定错误率的话,则可以用布隆过滤器思想。...布隆过滤器主要运用在过滤恶意网址用,将所有的恶意网址建立在一个布隆过滤器上,然后对用户访问网址进行检测,如果在恶意网址那么就通知用户。

1.3K50

布隆过滤器

原理 S集合中有n个元素,利用k个哈希函数,将S每个元素映射到一个长度为m位(bit)数组B不同位置上,这些位置上二进制数均置为1,如果待检测元素经过这k个哈希函数映射后,发现其k个位置上二进制数不全是...大部分数据结构最少也要存储数据本身值。但是,布隆过滤器完全不用存储数据本身,它提供了一种分散式解决办法。...误报率和占用空间权衡 一般布隆过滤器(比如redis)有两个参数,第一个是预计元素数量 n(对应Redisinitial_size),第二个是错误率 p(对应rediserror_rate)...2 时,错误率升至 15% 错误率为 0.1%,倍数比为 2 时,错误率升至 5% 当实际元素数量超过初始化数量时,应该对布隆过滤器进行 重建,重新分配一个 更大过滤器,再将所有的历史元素批量添加。...其它用途 布隆过滤器最常用于爬虫URL过滤,爬虫通常有一个URL列表,保存着将要下载和已经下载网页URL,当它下载了一个网页,网页中提取到新URL后,需要判断该URL是否已经存在于列表

12820

hash 算法原理及应用漫谈

这里也留给大家一个思考点,如果恶意用户直接抓取了你活动参与链接,也就是拿到了你计算后hash值,那技术角度上说,我们还有没有其他可以提升恶意用户违法成本呢?...5.3 布隆过滤器 布隆过滤器被广泛用于黑名单过滤、垃圾邮件过滤、爬虫判重系统以及缓存穿透问题。对于数量小,内存足够大情况,我们可以直接用hashMap或者hashSet就可以满足这个活动需求了。...布隆过滤器其实是基于bitmap一种应用,在1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合。...布隆过滤器原理见下图所示: 布隆过滤器原理示意 上图所示例子,数据a、b、c经过三次hash映射后,对应bit位都是1,表示这三个数据已经存在了。...而d这份数据经过映射后有一个结果是0,则表明d这个数据一定没有出现过。布隆过滤器存在假阳率(判定存在元素可能不存在)问题,但是没有假阴率(判断不存在原因可能存在)问题。

1.7K50

重学算法:Hash 算法原理及应用漫谈

5.3 布隆过滤器 布隆过滤器被广泛用于黑名单过滤、垃圾邮件过滤、爬虫判重系统以及缓存穿透问题。对于数量小,内存足够大情况,我们可以直接用hashMap或者hashSet就可以满足这个活动需求了。...布隆过滤器其实是基于bitmap一种应用,在1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合。...布隆过滤器原理示意 上图所示例子,数据a、b、c经过三次hash映射后,对应bit位都是1,表示这三个数据已经存在了。而d这份数据经过映射后有一个结果是0,则表明d这个数据一定没有出现过。...布隆过滤器存在假阳率(判定存在元素可能不存在)问题,但是没有假阴率(判断不存在原因可能存在)问题。即对于数据e,三次映射结果都是1,但是这份数据也可能没有出现过。...误判率数据公式如下所示: ? 其中,p是误判率,n是容纳元素,m是需要存储空间。由公示可以看出,布隆过滤器长度会直接影响误报率,布隆过滤器越长其误报率越小。

1K10

Redis 之布隆过滤器与布谷鸟过滤器

过滤器由此诞生: - 布隆过滤器 - 布隆过滤器(Bloom Filter)大概思路就是,当你请求信息来时候,先检查一下你查询数据我这有没有,有的话将请求压给数据库,没有的话直接返回...待小布谷鸟破壳而出之后,因为布谷鸟体型相对较大,它又将养母其它孩子(还是蛋)巢里挤走 —— 从高空摔下夭折了。...因为每一个元素都可以放在两个位置,只要任意一个有空位置,就可以塞进去。所以这个伤心被挤走蛋会看看自己另一个位置有没有空,如果空了,自己挪过去也就皆大欢喜了。但是如果这个位置也被别人占了呢?...布谷鸟过滤器 布谷鸟过滤器和布谷鸟哈希结构一样,它也是一维数组,但是不同于布谷鸟哈希是,布谷鸟哈希会存储整个元素,而布谷鸟过滤器只会存储元素指纹信息(几个bit,类似于布隆过滤器)。...首先布谷鸟过滤器还是只会选用两个 hash 函数,但是每个位置可以放置多个座位。这两个 hash 函数选择比较特殊,因为过滤器只能存储指纹信息。

73520

居然还有布谷鸟过滤器,有何用处呢?

布隆过滤器 布隆过滤器(Bloom Filter)大概思路就是,当请求信息时候,先检查一下查询数据我这有没有,有的话将请求压给数据库,没有的话直接返回,是如何做到呢?...布隆过滤器增强版 为了解决上面布隆过滤器问题,出现了一个增强版布隆过滤器(Counting Bloom Filter),这个过滤器思路是将布隆过滤器bitmap更换成数组,当数组某位置被映射一次时就...待小布谷鸟破壳而出之后,因为布谷鸟体型相对较大,它又将养母其它孩子(还是蛋)巢里挤走 —— 从高空摔下夭折了。...布谷鸟过滤器 布谷鸟过滤器和布谷鸟哈希结构一样,它也是一维数组,但是不同于布谷鸟哈希是,布谷鸟哈希会存储整个元素,而布谷鸟过滤器只会存储元素指纹信息(几个bit,类似于布隆过滤器)。...这两个hash函数选择比较特殊,因为过滤器只能存储指纹信息。当这个位置上指纹被挤兑之后,它需要计算出另一个对偶位置。而计算这个对偶位置是需要元素本身,我们来回忆一下前面的哈希位置计算公式。

46220

布隆过滤器

布隆过滤器由一个很长二进制向量(位向量、位数组、Bit Array)和一系列随机映射函数组成。 布隆过滤器优点是高效、占用空间少。但缺点是返回结果是概率性,而不是准确。...对布隆过滤器有了一个简单印象之后,接下来就要继续深入。 如何判断一个元素是否在一个集合 如果想要判断一个元素是否在一个集合,首先想到就是将所有元素保存起来,然后通过比较确定。...在链表、树等数据结构中就是这样思想。但是随着集合越来越大,检索速度就会越来越慢。 这时有一个更优方案。使用一个映射函数将一个元素映射成一个位数组(Bit Array)一个点。...例如,假设Hash函数是良好,想将冲突率降低到百分之一,那么位数组长度为m哈希表就只能存储m/100个元素,显然浪费了很多空间。 解决办法就是使用多个Hash函数,也就是布隆过滤器。...对于布隆过滤器bit位数m,插入元素数量n,误报率p,哈希函数个数k,我们可以使用以下公式在决定哈希函数个数和布隆过滤器长度。 ?

48830

大数据量下集合过滤—Bloom Filter

Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出。它实际上是一个很长二进制向量和一系列随机映射函数。...布隆过滤器可以用于检索一个元素是否在一个集合。它优点是空间效率和查询时间都远远超过一般算法,缺点是有一定误识别率和删除困难。...Bloom Filter 原理 布隆过滤器原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组K个点,把它们置为1。...检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器基本思想。...long) (-n * Math.log(p) / (Math.log(2) * Math.log(2))); } /** * 计算最佳k值,即在Bloom过滤器插入每个元素哈希数

1.7K50
领券