布隆过滤器浅析

布隆过滤器

这是一个在大数据中判断某个数据是否可能存在的组件,
并不能肯定数据一定存在 ,只能肯定数据一定不存在
其主要运用hash方式,对数据做出映射,可能多个数据能够被映射为同一个数据。
主要用在大数据搜索的前置过滤。

hash函数以及冲突处理

冲突:映射函数 Hash(key)=addr ;hash 函数可能会把两个或两个以上的不同 key 映射到同一地址,这种情况称之为冲突(或者 hash 碰撞)
负载因子:数组中存储元素个数/数据长度,负载因子越小,冲突越小
冲突处理:

  1. 链表法:将冲突元素使用链表链接起来,冲突元素超过256(经验值)时候,该链表转化为平衡二叉树
    数据库、redis等使用头插法, 他们认为最后插入的元素后续访问的可能性更高
  2. 开放寻址法:插入数据遇到该位有数据,则向后推一定长度插入对应位置。

siphash主要解决字符串接近的强随机分部性
插入位置后移位置列表有两种后移算法(哈希探查):

  1. i+1,i+2,i+3……
  2. i-1^2, i+2^2, i-3^2……

hash聚集

定义: 采用开放寻址时候,发现该处位置被占用,向后推移,对应位置继续被占用。
双重哈希解决hash聚集问题
在.net HashTable类的hash函数Hk定义如下:
Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) +

  1. %(hashsize – 1)))] % hashsize
    在此 (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1))) 与
    hashsize互为素数(两数互为素数表示两者没有共同的质因⼦);
    执⾏了 hashsize 次探查后,哈希表中的每⼀个位置都有且只有⼀次被访问到,也就是说,对于给定的 key,对哈希表中的同⼀位置不会同时使⽤ Hi 和 Hj;
    具体原理看:https://www.cnblogs.com/organic/p/6283476.htm

散列表

根据key计算key在表中的存储位置的数据结构,是key和其所在存储地址的映射关系
需要存储具体元素

布隆过滤器

布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在
不存储具体元素
不比较字符串
实际由位图 + n个hash函数构成
将数据通过一定规律映射到位图对应的位置。可能多个数据能够映射到同一位置,所以查询某位为1,则该数据可能存在,但不确定是否是该数据映射到该位置。
在这里插入图片描述

构造

n:预计存储数据
p:假阳率:错误数据比率
m:位图占用空间
k:hash函数的哥数
n = ceil(m / (-k / log(1 - exp(log§ / k))))
p = pow(1 - exp(-k / (m / n)), k)
m = ceil((n * log§) / log(1 / pow(2, log(2))))
k = round((m / n) * log(2))
确定pn,计算出mk,通过下述网站可以选择最好的参数
https://hur.st/bloomfilter
在这里插入图片描述

hash函数中为什么会出现i*31
  1. i*31 = i(32-1) = i(1<<5-1)
  2. 31为质数,这个数据的随机分布性能最好
选择hash

计算速度快
强随机分部性:murmurhash1,murmurhash2,murmurhash3,ciphash(redis6.0中主要使用)
选择一个 hash 函数,通过给 hash 传递不同的种子偏移值,采用线性探寻的方式构造多个 hash函数;

#define MIX_UINT64(v) ((uint32_t)((v>>32)^(v)))
uint64_t hash1 = MurmurHash2_x64(key, len, Seed);
uint64_t hash2 = MurmurHash2_x64(key, len, MIX_UINT64(hash1));
for (i = 0; i < k; i++) // k 是hash函数的个数
{
	Pos[i] = (hash1 + i*hash2) % m; // m 是位图的⼤⼩
}

分布式一致性hash

比如存储数据到数据库,为了防止直接访问数据库,造成压力过大,在中间加入缓存(redis),redis会先采用布隆过滤器来管理客户端连接,布隆过滤器中hash选择过于随机,后续如果添加服务器节点时候,hash选择将会发生改变,影响之前的数据。 此处可以将hash选择算法做出一定修改,形成一个hash圆环,大小2^32, 比如之前节点为:A->B->C,现在添加节点D,最后节点访问成为D->A-B-C, 之前从A开始访问的数据将继续从A开始访问,添加节点D将不再影响从A节点处访问的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值