首页 > 编程语言 >使用JAVA实现布隆过滤器

使用JAVA实现布隆过滤器

时间:2023-04-04 14:36:31浏览次数:70  
标签:JAVA int 布隆 哈希 过滤器 Hash hash

什么是布隆过滤器

布隆过滤器是一种内存友好的数据结构,它可以高效地判断一个元素是否存在于一个集合中,以及大幅减少磁盘/数据库等IO操作。与哈希表和树等数据结构不同,它可以实现非常高的查找速度和存储效率,适用于需要快速并且高效地处理大数据集的场景。

布隆过滤器原理

布隆过滤器的基本思想是使用多个哈希函数对元素进行多次哈希,然后在对应的位上置位。其中K个互不相关的哈希函数会把元素映射成K个整数值,这些整数值将被映射为集合中的K个二进制位。当查询一个元素时,如果这K个二进制位都是1,我们就认为该元素存在于集合中。

可以通过以下几个参数来定义一个布隆过滤器:

  • n 表示元素的数量(即要存储多少个元素)
  • m 表示位数组的长度
  • k 表示使用的哈希函数个数

布隆过滤器实现

Java已经提供了一个java.util.BitSet实现了位数组的基本操作。因此,我们可以直接使用该类作为布隆过滤器的底层数据结构。以下是一个简单的Java实现布隆过滤器的示例代码:

import java.util.BitSet;

public class BloomFilter {
    private BitSet bitSet;
    private int m;
    private int k = 8;
    private Hash[] hashes;

    public BloomFilter(int n, double f) {
        // 通过 n 和 f 计算出需要的 bit 数组长度
        m = (int)Math.ceil(n * Math.log(f) / Math.log(1.0 / Math.pow(2.0, Math.log(2.0))));
        bitSet = new BitSet(m);

        hashes = new Hash[k];
        for (int i = 0; i < k; i++) {
            hashes[i] = new Hash(m, i + 1);
        }
    }

    public void add(String element) {
        for (Hash hash : hashes) {
            int hashValue = hash.hash(element);
            bitSet.set(hashValue, true);
        }
    }

    public boolean contains(String element) {
        for (Hash hash : hashes) {
            int hashValue = hash.hash(element);
            if (!bitSet.get(hashValue)) {
                return false;
            }
        }
        return true;
    }

    private static class Hash {
        private int m;
        private int seed;

        public Hash(int m, int seed) {
            this.m = m;
            this.seed = seed;
        }

        public int hash(String element) {
            int result = 0;
            for (int i = 0; i < element.length(); i++) {
                result = seed * result + element.charAt(i);
            }
            return (m - 1) & result;
        }
    }
}

在上述代码中,我们使用了一个内部类Hash来实现多种不同的哈希函数。在初始化时需要指定被哈希的字符串的长度和具体的哈希种子。通过种子来保证不同的哈希函数所得到的哈希值的不同。在BloomFilter的构造函数中,我们计算出需要的位数组长度m,用于初始化BitSet。

add方法中,我们遍历所有哈希函数,计算出当前元素对应的哈希值,并将对应的二进制位置为1。同理,在contains方法中,我们先计算出元素对应的哈希值,然后根据BitSet中对应的二进制位数值是否为1来判断元素是否存在于集合中。

总结

布隆过滤器是一种高效的数据结构,可以适用于需要快速查询数据并具有大数据集的场景。虽然它不能完全保证元素不存在于集合中,但它的错误率非常低。在实践中,我们可以通过调整参数n、m和k来达到更佳的效果。

以上就是Java实现布隆过滤器的全部内容。希望呈现的内容能够对您有所帮助!

标签:JAVA,int,布隆,哈希,过滤器,Hash,hash
From: https://www.cnblogs.com/futureman/p/17286308.html

相关文章

  • java xxljob 根据参数运行业务
    配置定时任务不启动,手动执行根据传入的参数完成既定的业务 /** *自定义增删除平台酒体数据 *参数:startDate,endDate[yyyy-MM-dd) * *@return{@link*@return:com.xxl.job.core.biz.model.ReturnT<java.lang.String>} *@author:xxx *@date2023/3/12 **......
  • 深入理解 Java 中 SPI 机制
    vivo互联网技术微信公众号 作者:姜柱SPI(ServiceProviderInterface),是JDK内置的一种服务提供发现机制,本文由浅入深地介绍了JavaSPI机制。一、简介SPI(ServiceProviderInterface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如j......
  • 为什么 JavaScript 中 0.1 0.2 不等于 0.3 ?
    vivo互联网技术微信公众号 作者:刘洋在js中进行数学的运算时,会出现0.1+0.2=0.300000000000000004的结果,一开始认为是浮点数的二进制存储导致的精度问题,但这似乎不能很好的解释为什么在同样的存储方式下0.3+0.4=0.7可以得到正确的结果。本文主要通过浮点数的二进制存储及运算,和......
  • Kotlin 协程真的比 Java 线程更高效吗?
    vivo互联网技术微信公众号 作者:吴越网上几乎全部介绍Kotlin的文章都会说Kotlin的协程是多么的高效,比线程性能好很多,然而事情的真相真是如此么?协程的概念本身并不新鲜,使用C++加上内嵌汇编,一个基本的协程模型50行代码之内就可以完全搞出来。早在2013年国内就有团队开源了号称支持......
  • CSDN粘贴图片自动上传到服务器(Java版)
    ​ 如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • selenium Java基础一
      1、下载相应的浏览器驱动包//设置环境变量SystemsetProperty("webdriver.firefox.marionete","D:\\geckodriver.exe");//初始化driverWebDriver driver=newFirefoxDriver();/请求地址driver.get("http://www.baidu.com"); 2、定位元素By.tagName()   ......
  • 155.最小栈 Java
    155.最小栈设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素......
  • java lambda List 查找 anyMatch() allMatch() noneMatch()
    packagelambda.list;importcn.hutool.core.util.ObjectUtil;importlombok.extern.slf4j.Slf4j;importorg.junit.Test;importpojo.Dome;importjava.util.ArrayList;importjava.util.List;/***@Author:xxx*@date2021/5/14**/@Slf4jpublicclassSe......
  • java lambda List 分组 Collectors.groupingBy
    packagelambda.list;importlombok.extern.slf4j.Slf4j;importorg.junit.Test;importpojo.Dome;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;/***@Author:xxx*@date2021/5/14**/@Sl......
  • Java使用IntelliJ IDEA配置Maven并管理一个webapp项目
    1、下载并安装Mavenapache官网地址:http://maven.apache.org/download.cgips:maven的使用是基于JDK的,所以电脑必须有JDK解压到文件夹,并配置环境变量。1、MAVEN_HOME,地址为maven的地址2、path,地址为%MAVEN_HOME%\binwin+r输入cmd进终端,输入mvn-v测试maven是否安装成功修改maven......