布隆过滤器

哈希表(hash)详解

为君一笑 提交于 2019-12-05 05:28:44
哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置 = function(关键字) 这里的对应关系function称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数function既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行 取余 ,取余结果就当作数组的 下标 ,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出 ,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。) 而当使用哈希表进行 查询的时候,就是再次使用哈希函数将key转换为对应的数组下标【仍通过映射哈希函数function】

大白话布隆过滤器

梦想的初衷 提交于 2019-12-04 07:50:00
大白话布隆过滤器 https://www.cnblogs.com/CodeBear/p/10911177.html 本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。 布隆过滤器的应用 我们先来看下布隆过滤器的应用场景,让大家知道神奇的布隆过滤器到底能做什么。 缓存穿透 我们经常会把一部分数据放在Redis等缓存,比如产品详情。这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。一般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放入缓存,一切看起来很美好。但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么大量的请求都怼到数据库,数据库的压力一下子就上来了

Redis 布隆过滤器

允我心安 提交于 2019-12-04 05:57:24
1、布隆过滤器 内容参考: https://www.jianshu.com/p/2104d11ee0a2 1、数据结构 布隆过滤器是一个BIT数组,本质上是一个数据,所以可以根据下标快速找数据 2、哈希映射 1、布隆需要记录见过的数据,这里的记录需要通过hash函数对数据进行hash操作,得到数组下标并存储在BIT 数组里记为1。这样的记录一个数据只占用1BIT空间 2、判断是否存在时:给布隆过滤器一个数据,进行hash得到下标,从BIT数组里取数据如果是1 则说明数据存在,如果是0 说明不存在 3、精确度 hash算法存在碰撞的可能,所以不同的数据可能hash为一个下标数据,故为了提高精确度就需要 使用多个hash 算法标记一个数据,和增大BIT数组的大小 也是因为如此,布隆过滤器判断为【数据存在】 可能数据并不存在,但是如果判断为【数据不存在】那么数据就一定是不存在的。 4、例子 下图映射 baidu字样到布隆过滤器中,用了三个不同的hash函数 3BIT 判断一个数据,BIT数组大小为8 哈希函数返回 1、4、7 . 我们现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为: 以下 4 位置发生了hash碰撞 5、如何选择哈希函数个数和布隆过滤器长度 显然,过小的布隆过滤器很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”

布隆过滤器、一致性hash

匿名 (未验证) 提交于 2019-12-03 00:13:02
hash 布隆过滤器:失误率 布隆过滤器:比特类型的数组 0 1 hash函数的大小不影响布隆过滤器的大小 m hash函数的个数:k=ln2*(m/n)=0.7*(m/n); 错误率:(1-e^(-n*k/m))^k; 一致性hash(负载均衡) 减少数据迁移的代价。加机器和减机器。 当服务器很少的时候,环可能不均匀。 一开始均匀,后期增删机器,数据迁移后就不均匀了。 解决方案 虚拟节点 给m1 复制1000个虚拟节点同理 m2 m3.。。。建立一个路由表,路由表对应虚拟节点和物理节点。 由增加机器后,仍然是均分的虚拟节点。增加节点同时增加同量的1000个虚拟节点。这1000个是 来源:博客园 作者: 博闻强识不是我 链接:https://www.cnblogs.com/bowenqianngzhibushiwo/p/11631962.html

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

谁说我不能喝 提交于 2019-12-02 15:15:20
在上一篇 Java 多线程爬虫及分布式爬虫架构探索 中,我们使用了 JDK 自带的 Set 集合来进行 URL 去重,看上去效果不错,但是这种做法有一个致命了缺陷,就是随着采集的 URL 增多,你需要的内存越来越大,最终会导致你的内存崩溃。那我们在不使用数据库的情况下有没有解决办法呢?还记得我们在上一篇文章中提到的布隆过滤器吗?它就可以完美解决这个问题,布隆过滤器有什么特殊的地方呢?接下来就一起来学习一下布隆过滤器。 什么是布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 ,它是在 1970 年由一个名叫布隆提出的,它实际上是由一个很长的二进制向量和一系列随机映射函数组成,这点跟哈希表有些相同,但是相对哈希表来说布隆过滤器它更高效、占用空间更少,布隆过滤器有一个缺点那就是有一定的误识别率和删除困难。布隆过滤器只能告诉你某个元素一定不存在或者可能存在在集合中, 所以布隆过滤器经常用来处理可以忍受判断失误的业务,比如爬虫 URL 去重。 布隆过滤器原理 在说布隆过滤器原理之前,我们先来复习一下哈希表,在上一篇文章中,我们利用的是 Set 来进行 URL 去重,我们来看看 Set 的存储模型 URL 经过一个哈希函数后,将 URL 存入了数组里,这样查询时也是非常高效的,但是由于数组里存入的是 URL,随着 URL 的增多,需要的数组越来越大,意味着你需要更多的内存

redis之布隆过滤器

旧时模样 提交于 2019-12-02 09:43:12
布隆过滤器是什么?   布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率 布隆过滤器基本使用   布隆过滤器有二个基本指令,bf.add 添加元素,bf.exists 查询元素是否存在,如果想要一次添加多个,就需要用到 bf.madd 指令。同样如果需要一次查询多个元素是否存在,就需 要用到 bf.mexists 指令。 127.0.0.1:6379> bf.add codehole user1 (integer) 1 127.0.0.1:6379> bf.add codehole user2 (integer) 1 127.0.0.1:6379> bf.add codehole user3 (integer) 1 127.0.0.1:6379> bf.exists codehole user1 (integer) 1 127.0.0.1:6379> bf.exists codehole user2 (integer) 1 127.0.0.1:6379> bf.exists codehole user3 (integer) 1 127.0.0.1:6379> bf.exists codehole

[转载]布隆过滤器(Bloom Filter)

余生颓废 提交于 2019-12-01 20:41:49
[转载]布隆过滤器(Bloom Filter) 这部分学习资料来源: https://www.youtube.com/watch?v=v7AzUcZ4XA4 Filter判断不在,那就是肯定不在;Filter判断在,那只能说有一定几率在 有点乱啊,意思就是: 布隆过滤器会倾向于判断在 ,这就是它的误差:它把可能不在的都说成是在。 用一个函数将元素映射到一个二进制数组中。当需要插入时,将插入元素映射为二进制位,如果数组中有至少对应的一个位不是1,就说明不在。 一个更完整的例子: 误差就是B!B本来不存在,但是判断就是存在了,所以就是判断失误了:它会将一些本来不存在的情况判断为存在。 正是因为这个误识别率,所以它被称为Filer,也就是“过滤器”,它的过滤效果不是100%的。 使用案例: 比特币网络: PS,我个人是不相信区块链的,详见https://www.zhihu.com/question/43572793里大佬有理有据的解释,这里就是个例子 附上各个节点的含义: SPV节点:快速判断是否有交易记录,说没有就是没有,用以提升效率 如果判断说存在,再去响应的区块中查。 来源: https://zhuanlan.zhihu.com/p/43263751 布隆过滤器数据结构 布隆过滤器是一个 bit 向量或者说 bit 数组 ,长这样: 如果我们要映射一个值到布隆过滤器中,我们需要

布隆过滤器简述及应用

谁都会走 提交于 2019-11-27 18:56:23
一、布隆过滤器 1、维基百科   布隆过滤器( Bloom Filt er)是1970年由布隆提出的。   实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于 检索一个元素是否在一个集合中 。    优点 是不需要存储 key,节省空间,空间效率和查询时间都远远超过一般的算法, 缺点 是有一定的误识别率和删除困难。 2、原理概念   如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。    链表、树、散列表(哈希表) 等等数据结构都是这种思路,但是随着集合中元素的增加,需要的存储空间越来越大;同时检索速度也越来越慢,检索时间复杂度分别是O(n)、O(log n)、O(1)。   布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组(Bit array)中的 K 个点,把它们置为 1 。检索时,只要看看这些点是不是都是1就知道元素是否在集合中;如果这些点有任何一个 0,则被检元素一定不在;如果都是1,则被检元素很可能在(之所以说“ 可能 ”是误差的存在)。 3、自我理解   直观的说,Bloom 算法类似于一个 HashSet(通过哈希算法得出元素的哈希地址,通过对比哈希地址就可以确定两个对象是否为同一个地址),用来判断某个元素(key)是否在某个集合中。   和一般的 HashSet

BloomFilter&python支持

寵の児 提交于 2019-11-27 08:16:35
BloomFilter&python支持 BloomFilter 布隆过滤器是一种概率空间高效的数据结构。它与hashmap非常相似,用于检索一个元素是否在一个集合中。 它在检索元素是否存在时,能很好地取舍空间使用率与误报比例。即Bloom Filter是会误判的,它只会把不存在于集合中的元素误判成存在于集合中,而不会把存在于集合中的元素误判成不存在集合中。 正是由于这个特性,它被称作概率性数据结构(probabilistic data structure)。 BloomFilter原理 布隆过滤器维护一个N位的位数组,其中N是位数组的大小。它还有另一个参数k,表示使用哈希函数的个数。这些哈希函数用来设置位数组的值。当往过滤器中插入元素x时,h1(x), h2(x), ..., hk(x)所对应索引位置的值被置“1”,索引值由各个哈希函数计算得到。注意,如果我们增加哈希函数的数量,误报的概率会趋近于0.但是,插入和查找的时间开销更大,布隆过滤器的容量也会减小。 为了用布隆过滤器检验元素是否存在,我们需要校验是否所有的位置都被置“1”,与我们插入元素的过程非常相似。如果所有位置都被置“1”,那也就意味着该元素很有可能存在于布隆过滤器中。若有位置未被置“1”,那该元素一定不存在。 记录元素 下面我们看一下向Bloom Filter插入字符串的具体过

BloomFilter(布隆过滤器)

妖精的绣舞 提交于 2019-11-27 08:16:00
原文链接 : http://blog.csdn.net/qq_38646470/article/details/79431659 1.概念: 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。 它的优点 是空间效率和查询时间都远远超过一般的算法, 缺点 是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例False negatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)。 2.实现原理: 直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位