d-Left Counting Bloom Filter

Hash的输出值通常有两种用途:一种用作地址,比如在哈希表中要存储一个元素,首先要针对这个元素生成一个随机地址;另一种用作fingerprint(指纹我理解可能就是一种唯一的身份识别)(或者叫digital summary),比如将密码字符串hash成一个fingerprint,验证时进行核对。今天我要介绍的这种存储信息的方式将以上两种用途结合了起来:一个hash value分作两部分,一部分用作存储地址,另一部分用作fingerprint。

所以第一步生成这个元素的存储地址,第二步用另一个hash函数生成这个元素的fingerprint,然后把fingerprint存到第一个生成的地址里。

如果只用一个hash函数,将它的hash value分作两部分,高位部分用作随机地址,低位部分留作fingerprint。这就是d-leftcounting BloomFilter的构造过程,但是负载不均衡,d-lefthash就是解决这个问题

同一个hash value高位用作地址低位用作fingerprint,这就意味着同一个地址对应着多个fingerprint。一个地址对应一个bucket,因此一个bucket需要存储多个fingerprint。由于单个哈希函数的hash value分布不均,各个bucket的负载也不均衡。如果每个bucket能存储的fingerprint数量固定,为了不溢出必须按最坏的情况来分配bucket的容量,这就造成了不小的浪费。

使用d-left hashing之后,fingerprint的分布相对比较均衡,因此大大减少了空间的浪费。原来即使分配很大的哈希表,由于按最坏情况分配bucket容量,仍然很难缩小bucket的容量,并且哈希表中大量空间闲置。而使用d-left hashing可以让存储的信息分布均匀,更加紧凑,从而用更小的空间存储同样多的信息。在Perfect Hashing VS. Bloom Filter一文中提到过,d-left counting bloom filter可以比counting bloom filter节省至少一倍的空间,就是因为counting bloom filter负载不均衡,很多空间都被浪费掉了

从另一个角度考虑,d-left hashing扮演的其实是一个perfect hash function的角色。原来负载不均衡的情况下,碰撞的情况很严重,使用d-left hashing后大大减少了碰撞。当然,它不能完全消除碰撞,因此它只是用一种开销较小的方式模拟了perfect hash function,可以称它为almost-perfect hash function。

所以他就是用d-left hashing的方法存储fingerprint:
**首先:**我们使用一个d-left哈希表,表中每个bucket可以容纳若干个(固定数量的)cell,每个cell的位数固定,包括一个fingerprint和一个counter。 d个hash,d个存储地址我们仍然用一个哈希函数,但把它的hash value分成d+1段:高位的d段分别用作d个存储地址,每个子表对应一个,剩下的低位部分作为fingerprint。

**操作:**在添加一个key时,先对它作一次hash,得到d个存储位置和一个fingerprint,然后判断d个位置中的负载情况,并在负载最轻的几个位置中选择最左边的插入。如果选择的位置已经存储了相同的fingerprint,就把那个cell的counter加1。在删除一个key时,同样地作一次hash,然后在d个存储位置查找相应的fingerprint,如果找到就将这个cell置空或者将相应的counter减1。

**参数结构:**最后,我们将d-left counting bloom filter与标准的counting bloom filter作一比较。假设要表示的集合有m个元素,构造d-left counting bloom filter的各个参数如下:
1.d-left哈希表包含4个子表;
2.每个子表包含m/24个bucket,使得bucket的平均负载是6个元素;
3.子表中每个bucket可以容纳8个cell,8个就能以很高的概率保证不会溢出;
4. cell中每个counter包含2位,可以容纳4个相同的fingerprint;注意,我们必须给fingerprint设置一个表示空的状态,比如全0,这样才能用2位counter表示4个fingerprint。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值