首页 > 其他分享 >布隆过滤器

布隆过滤器

时间:2024-11-11 08:46:23浏览次数:3  
标签:存储 int 元素 布隆 哈希 过滤器

了解布隆过滤器

日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件 中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。 一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。 比如说,一个像Yahoo,Hotmail 和Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。

如果用哈希表,每存储一亿个 email 地址,就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB,即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

1. 用哈希表存储用户记录,缺点:浪费空间

2. 用位图存储用户记录,缺点:位图一般只能处理整形,如果内容编号是字符串,就无法处理了。

3. 将哈希与位图结合,即布隆过滤器

布隆过滤器的提出

布隆过滤器是由布隆(Burton Howard Bloom)提出,布隆过滤器是一种紧凑型,概率型数据结构,特点是可以高效的插入和查询元素,布隆过滤器可以告诉你“元素可能存在和一定不存在”,通过多种哈希数将元素映射到位图中,此种方式不仅可以提升查询效率,也可以节省大量的空间

     

布隆过滤器的插入

向布隆过滤器插入:baidu词语

再向布隆过滤器插入:tencent

插入方式:上图的布隆过滤器有三种Hash函数,然后使用三种Hash函数对插入值进行计算,计算出插入值的位图的下标,然后将下标的值改为零。

布隆过滤器的插入思想

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1。 所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零, 代表该元素一定不在哈希表中,否则可能在哈希表中。

注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。 比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其他元素的比 特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。

布隆过滤器的代码实现

public class SimpleHash {
    private int cap;
    private int seed;
    public SimpleHash(int cap , int seed){
        this.cap = cap;
        this.seed = seed;
    }
    public int hash(String value){
        int result = 0;
        int len = value.length();
        for (int i = 0; i < len; i++) {
            result = seed * result + value.charAt(i);
        }
        return  (cap - 1) & result;
    }
}
public class BloomFilter {

    // Bitset默认大小

    private final static int DEFAULT_SIZE = 1 << 24;

    // 创建多个值,用于创建多个hash值

    private final static int [] seeds = new int[]{7,18,22,33,45,85};

    // 位图由于储存元素信息

    private BitSet bitSet;

    // 哈希函数所对应类

    private SimpleHash[] simpleHashes;

    private int size;

    public  BloomFilter(){

        this.bitSet = new BitSet(DEFAULT_SIZE);

        this.simpleHashes = new SimpleHash[seeds.length];

        for (int i = 0; i < seeds.length; i++) {

            simpleHashes[i] = new SimpleHash(DEFAULT_SIZE,seeds[i]);

        }

    }

    public void set(String value){

        if (value == null){

            return;

        }

        for(SimpleHash simpleHash : simpleHashes) {

            bitSet.set(simpleHash.hash(value));

        }

        size++;

    }

    public boolean contains(String value){

        if (value == null){

            return false;

        }

        for (SimpleHash f : simpleHashes){

            if (!bitSet.get(f.hash(value))){

                return false;

            }

        }

        return true;

    }



    public static void main(String[] args) {

        BloomFilter bloomFilter  = new BloomFilter();

        bloomFilter.set("果粒陈");

        System.out.println(bloomFilter.contains("果粒陈"));

        System.out.println(bloomFilter.contains("笨蛋果粒橙"));

    }

}

布隆过滤器优点

1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关

2. 哈希函数相互之间没有关系,方便硬件并行运算

3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势

4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势

5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能

6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

布隆过滤器缺陷

1. 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再建立一个白 名单,存储可能会误判的数据) 2. 不能获取元素本身

3. 一般情况下不能从布隆过滤器中删除元素

4. 如果采用计数方式删除,可能会存在计数回绕问题

得嘞,这篇博客算是唠完啦!希望我这一通“碎碎念”没把你给念烦咯,要是能博您一笑或者让您有点小收获,那我这码字的功夫可就没白费呀。咱下回再接着侃,各位看官,回见咯~

标签:存储,int,元素,布隆,哈希,过滤器
From: https://blog.csdn.net/h3286918168/article/details/143671697

相关文章

  • 布隆过滤器--详解
    抛砖引玉假设遇到这样一个问题:一个网站有20亿url存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个url,你如何快速判断该url是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出。方案一可能很多人首先想到的会是使用HashSet,因为HashSet基于Ha......
  • 京东面试:亿级黑名单 如何设计?亿级查重 呢?(答案含:布隆过滤器、布谷鸟过滤器)
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 一文理解布隆过滤器和布谷鸟过滤器
    作者:京东保险王奕龙最近在大促中使用到了布隆过滤器,所以本次借着机会整理下相关内容,并了解了布谷鸟过滤器,希望对后续学习的同学有启发~布隆过滤器布隆过滤器是概率性数据结构,用于检查元素是否存在集合中。布隆过滤器并不存储集合中的所有元素,而是存储元素的哈希表示,因此牺牲......
  • Spring常用过滤器(Filter)-AuthorizationFilter
    AuthorizationFilter:授权过滤器,用于执行访问控制决策。1.1定义与作用:1.1.1定义:AuthorizationFilter是ASP.NETMVC中用于安全性检查的过滤器,它通过实现IAuthorizationFilter接口来定义。该接口提供了一个OnAuthorization方法,用于在用户请求到达Action方法之前执行授权逻辑。......
  • 【bypass系列】绕过命令过滤器:探索Unix/Linux中的Bypass技术
    原创visionsec安全视安免责声明该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。在Unix或Linux系统的安全测试和网络防御中,了解如何绕过命令过滤器是非常重要的。今天,我们将探讨......
  • asp.net dotnet razor page mvc 过滤器 数据验证过滤器 数据库事务过滤器
    asp.netdotnetrazorpagemvc过滤器数据验证过滤器数据库事务过滤器Program.cs注册过滤器services.AddRazorPages(opt=>{opt.Conventions.ConfigureFilter(newDbContextTransactionPageFilter());opt.Conventions.ConfigureFilter(n......
  • vue 中的过滤器filters使用详解
    Vue中的过滤器1.过滤器是什么在Vue2中,过滤器(filters)是用于对数据进行格式化的小型工具,主要用于模板表达式,方便处理文本展示时的格式化工作。过滤器不会改变原始数据,只影响数据的显示方式。2.应用场景文本格式化:如将字符串首字母大写或将全局文本转为大写。日期格......
  • 【C++】布隆过滤器的概念与特点解析
    目录00.引入01.布隆过滤器的概念特点1:极低的内存消耗特点2:快速查询特点3:假阳性误判(禁止删除)02.布隆过滤器的底层实现00.引入上一篇博客介绍了位图这一数据结构,它可以在大量整数中快速查找某一数据是否存在,并且内存占用率很低(例如,查找40亿个整数只需0.5G空间)。博客链......
  • Spring常用过滤器(Filter)-SecurityContextHolderAwareRequestFilter
    SecurityContextHolderAwareRequestFilter:使HttpServletRequestWrapper能够感知SecurityContextHolder的过滤器。1.1功能概述:1.1.1SecurityContextHolderAwareRequestFilter通过Wrapper/Decorator模式对HttpServletRequest进行包装,使其具备访问SecurityContextHolder中安全......
  • 禁用tomcat缓存过滤器
    <!--去掉tomcat的etag和Last-Modified响应头的过滤器--> <filter> <filter-name>noetag</filter-name> <filter-class>com.epoint.basic.filter.EpointNoETagFilter</filter-class> </filter> <filter-mapping> <f......