• Home
  • Posts
    • All Posts
    • All Tags
  • Daily Summary
  • Technical Debt
  • Valuable Blog
  • Projects
  • About
    • Robin photo

      Robin

      Write Elegant Code.

    • Learn More
    • Email
    • Github

布隆过滤器

概述

什么是布隆过滤器?布隆过滤器作为一个过滤器,可以高效地解决元素“在不在”的问题。重点是在“不在”的问题

原理

布隆过滤器结合了数组和哈希函数来做实现。
在一个元素存入过滤器的时候,过滤器会先用多个哈希函数计算对应的哈希值和数组下标。得到下标后,把响应下标的数值由 0 置 1 表示该元素存在。原理很好理解,其实就是一个有多个 hash 函数的位图数组。

优点

  • 内存消耗小。因为不用将整个元素存储在内存里面,所以内存消耗大大减小
  • 快。hash 值的计算可以认为是 O(1) 的,所以对于元素存在性判断,整体来说也是 O(1) 的
  • 安全。内存里面没有实际的数据,不用担心泄漏

缺点

  • 有误差。hash 函数不可避免的存在误差。过滤器也没有使用类似 hashMap 的链表来解决冲突,所以误差总是存在。但是对于不存在的数据,布隆过滤器的判断总是准确的
  • 不能删除数据。在有冲突的情况下,删除数据可能对其他的数据也产生影响。如果不使用位图,而是通过数组进行计数,可以删除数据吗?

误差可以通过计算得到,具体参看 Bloom filter