返回

【Cassandra】bloom 过滤器

发布时间:2022-11-16 00:17:19 290
# 数据

问题:如何判断一个元素是否存在于一个集合中

最简单直观的办法就是常用的数据结构与算法---哈希表。但是哈希表的特点是必须存储每一个加入的值,所以空间复杂度与值的数目成正比,并且一般哈希表是有装载因子这个指标,所以一般空间会大于元素的个数。在海量数据的情况下并不是很合适。

Bloom 过滤器就是针对海量数据情况下查询某一个元素是否存在的一种方法。

其基本的思路是:

找一个很大的bit数组m和k个哈希函数,每一个哈希函数都可以把带存储元素映射到bit数组的每一位。然后每一个待存储的元素x都让这k个哈希函数生成一个值,得到一个序列g1,g2.。。gx。然后g就是m的索引,把m中相应的位置设置为1。这样给定一个数据y,只需要根据k各哈希函数计算出g,只有m中每一个g代表的位置都是1,就认为y是存在的。这个方法的优点是所需要的空间和时间都是常数级别,更加高效。但是缺点也很明显,存在误判而且无法删除。

不过这两个缺点可以改进。

误判的概率是比较小的,据说是万分之一。以下是分析的大致过程:

如果这个元素确实被加入,那么不会误判。如果这个元素没有加入,但是它对应的m数组却恰好被其他的元素设为了1,导致我们认为该元素存在,这是误判的原因,也是我们关系的误判概率。假设已有n个元素,k个哈希函数,m数组大小是m。

那么,某一个数据经过一个哈希函数将数组中任何一位设置为1的概率是1/m。没有设置为1的概率为1-1/m。那么k个哈希函数都没有将这一位设置为1的概率为(1-1/m)^k。n个元素都没有将这一位设置为1的概率为(1-1/m)^kn。那么至少有一个数把该位设置为1的概率是1-(1-1/m)^kn,那么现在需要k位全部是1,概率就是(1-(1-1/m)^kn)^k,这也就是误判的概率。

实际上,这个误判的概率将直接决定m的大小和k的个数。

如果要支持删除,可以用int代替bit。

这便是Bloom过滤器的原理。

以下是两篇不错的博客:

 

Cassandra中使用了Bloom过滤器来检测key所代表的数据是否存在。

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
SQL表中新增数 2022-11-15 23:50:05