Bloom filter 的作用就是查找某个元素是否有可能在该集合中
比如我们有一个 10000 长度的数组,我们想要查找 "Hello" 字符串是否在这个数组中,那我们就必须要通过循环对比来判断,这样会非常的浪费时间
这个问题可以通过 Bloom filter 解决
Bloom filter 的特点是:有可能误判但一定不会漏判,换句话说就是查询返回的结果 “可能在集合中” 或 “绝对不在集合中”。
原理很简单,我们先创建一个长度是10的数组
const arr = [0,0,0,0,0,0,0,0,0,0]
然后我们假设:
a => 1
b => 2
c => 3
d => 4
e => 5
...
z => 24
然后假设集合里只有 a,z 和 ac
我们就将 a 变成 1,然后用 1 取余数组的长度,也就是 1 % 10 = 1,然后将数组下标为 1 的数值变成1。
将 z 变成 24,然后用 24 取余数组的长度,也就是 24 % 10 = 1,然后将数组下标为 4 的数值变成1。
将 ac 变成 13,然后用 13 取余数组的长度,也就是 13 % 10 = 3,然后将数组下标为 3 的数值变成1。
const arr = [0,1,0,1,1,0,0,0,0,0,0]
接下来我们假设,需要判断 e 在不在这个集合中
就将 e 变成 5
然后用 5 取余数组的长度,也就是 5 % 10 = 5,然后查看数组下标是 5 的元素是不是 1。
可以看到 arr[5] = 0,所以我们可以判断出 e 绝对不在这个集合中。
=====================
布隆过滤器用来给较多数据的集合做这种判断功能。所以如果数据较少,不需要用它
如果数据过多,那么我们需要更大的集合,不然耦合性会变大,所以要适时而用