最近再看Bloom Filter的删除问题,偶然间看到cuckoo filter的数据结构。Bloom Filter的思想是通过多维hash的办法,降低hash冲突的概率.。Basic Bloom Filter仅存储位图信息,只能判断一个key是否在集群内,可能存在假阳性(false positive),不存在假阴性(false negtive)。counting bloom filter还可以做统计计数,支持删除,但是空间消耗比较大。cuckoo hash则是一种高效的hash表实现,也是通过多维hash的办法降低hash桶的冲突提高hash表的存储效率。
cuckoo filter的思想是结合cuckoo hash和Bloom Filter思想一起:
- cuckoo filter是三维hash,第一维度hash找到cuckoo hash的槽位号,第二维hash计算key的指纹,第三位hash计算hash冲突key被踢走的位置
- 通过前面三次hash计算后,key对应的位置仅当存在有限的8个位置,指纹是唯一的,这样就可以避免假阴性,同时采用了cukko hash表,也可以支持删除操作
- 通过控制key的hash指纹的大小,来调整整个数据结构的空间占用的效率和假阳性的概率。指纹越大,空间占用越大,假阳性的概率越低