布隆过滤器

布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,空间效率和查询时间都远远超过一般的算法,但是缺点是其返回的结果是概率性的,而不是确切的。

# 实现原理

当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点(offset),把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

简单来说就是准备一个长度为m的位数组并初始化所有元素为 0,用 k 个散列函数对元素进行 k 次散列运算跟 len (m) 取余得到 k 个位置并将m中对应位置设置为 1。

m05wqzPawS

为什么会存在有不确定的情况呢?这里举一个简单的例子:假设现在有一个 8 bits 的二进制空间作为布隆过滤器,然后我们插入3和5这两个十进制数,哈希函数就选取简单的十进制转二进制,即插入 011 和 101,此时二进制空间的数据则为 00000111。

如果此时我们在布隆过滤器中检索3和5两个十进制数,则可以认为他们可能存在。检索十进制数9,对应二进制为1001,则判定为不存在,这个结果是必然的。但如果我们检索7这个十进制数,由于它的二进制表示为0111,因此会被误判为存在。所以才会出现上述的规则,而且随着插入元素数量的增加,出现误判的概率也会上升,因此布隆过滤器不适用于对精确度要求高的应用场合。

# 布隆过滤器添加元素

# 布隆过滤器查询元素

# 优缺点

# 布隆过滤器的优点:

# 布隆过滤器的缺点:

# 应用场景

# 具体实现

# guava布隆过滤器

# redis布隆过滤器

# References

标签

推荐

  1. SQL injection 實戰:在限制底下提升速度
  2. 接觸資安才發現我不懂前端
  3. 並行程式典範 (Paradigms): Golang V.S. Java
  4. 不識廬山真面目:Clickjacking 點擊劫持攻擊
  5. 比較 Java 和 Golang 在撰寫併發時處理共享變數的差異

Discussion(login required)