Java实现一个简易的布隆过滤器Bloom Filter

目录

什么是布隆过滤器?

作用:

实现一个简单的布隆过滤器:

解析:


什么是布隆过滤器?

布隆过滤器(Bloom Filter)是一种用于快速检查一个元素是否可能存在于一个集合中的数据结构,它通过使用位数组和哈希函数来实现。虽然它可以告诉你一个元素“可能存在”或“肯定不存在”,但它无法告诉你一个元素“肯定存在”。

        他的原理就是通过多个哈希函数,将一个元素映射到位数组的多个位置上,将0置为1。在判断一个元素是否存在时,就会用多个相同哈希函数映射,然后判断映射的位置上是否都为1,若都为1说明可能存在,因为可能有其他的一些元素映射会将这些位置正好都置为了1,所以可能会发生很小概率的误判,当然如果不都为1,那么一定是不存在的。

        这就是为什么说它可以告诉你一个元素“可能存在”或“肯定不存在”,但它无法告诉你一个元素“肯定存在”。                                                                                                     图片来源于网络。

作用:

        布隆过滤器通常用于在大型数据集中快速确定某个元素是否存在。

  1. 缓存优化: 布隆过滤器可以用于缓存系统中,以快速判断一个请求的数据是否存在于缓存中。通过在布隆过滤器中存储缓存中已有的键,可以在缓存查找之前迅速排除掉那些肯定不在缓存中的键,减少实际的缓存查询次数。

  2. 数据去重: 布隆过滤器可以用于数据去重,即判断一个数据是否已经存在于某个数据集中。在某些场景下,需要处理大量重复数据时,可以先使用布隆过滤器进行预判,如果布隆过滤器认为数据已存在,则无需进行实际的去重操作。

  3. 拦截垃圾邮件和恶意网址: 布隆过滤器可以用于拦截垃圾邮件、恶意网址等不良信息。在垃圾邮件过滤器或恶意网址过滤器中,可以将已知的垃圾邮件或恶意网址加入布隆过滤器,以快速过滤掉一部分恶意信息,减轻后续处理的负担。

  4. 网络爬虫 URL 去重: 在网络爬虫系统中,布隆过滤器可以用于去重 URL,避免重复抓取同一网页。通过在布隆过滤器中存储已经抓取过的 URL,可以快速判断一个 URL 是否已经被抓取过。

  5. 恶意的请求:黑客构造一些合理的但是在数据库中不存在的大量请求,由于数据合理前端可能过滤不掉,同时每个请求还不同,用redis也难以去重,大量请求直接查询数据库,造成数据库的巨大压力,这时就可以用布隆过滤器,快速判断请求数据是否在数据库中,若存在,才会去向下再去查redis和数据库。

实现一个简单的布隆过滤器:

public class Main{
    public static void main(String[] args) {

        BuLong.add("abc");
        BuLong.add("def");
        System.out.println(BuLong.check("abc")); // true
        System.out.println(BuLong.check("123")); // false
    }
}
class BuLong {

    private static int size = 100010;
    private static int hashFunction = 3; // 哈希函数的个数
    private static BitSet flags = new BitSet(size); // true为1,false为0

    /**
     * 检测一个字符串是否在redis或数据库种
     */
    public static boolean check(String s) {

        for (int i = 0; i < hashFunction; i++) { // 假设有三个哈希函数
            int idx = (s + i).hashCode() % size;
            if (!flags.get(idx)) return false;
        }
        return true;
    }

    /**
     * 添加字符串
     */
    public static void add(String s) {
        for (int i = 0; i < hashFunction; i++) {
            int idx = (s + i).hashCode() % size;
            flags.set(idx, true);
        }
    }
}

解析:

    因为只用01表示,所以为数组直接用bitSet来表示,真为1,假为0。
private static BitSet flags = new BitSet(size); // true为1,false为0

        其实就是进行了一个简单模拟,这里多个哈希函数直接用的这样:

       for (int i = 0; i < hashFunction; i++) { // 假设有三个哈希函数
            int idx = (s + i).hashCode() % size;
            if (!flags.get(idx)) return false;
        }

        传入的字符串 + 第 i 个 哈希函数,然后对size取余,就表示当前哈希函数映射的位置,我们置为1,也就是true。

        添加和检测都是利用哈希,改变或者检测对应的位置是否都为1而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能化办公时代来临:AI助你解放双手

文章目录 一、AI在办公领域的广泛应用二、AI助力办公效率提升1.自动化流程减少繁琐任务2.智能分析辅助决策制定3.个性化服务提升用户体验 三、AI提升办公效率的未来趋势1.更加智能化的办公场景2.更高效的团队协作3.更全面的数据安全保护 四、应对AI带来的挑战《AI高效工作一本通…

RabbitMQ3.13.x之九_Docker中安装RabbitMQ

RabbitMQ3.13.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.13.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # lates…

顺序统计量

一、顺序统计量 定义&#xff1a;将长度为 n 的数组按升序排序后&#xff0c;第 i 个位置的数字是该数组的第 i 小的量&#xff0c;称之为第 i 顺序统计量。 则一个数组中的最小值是第1顺序统计量&#xff0c;最大值是第n顺序统计量&#xff0c;中位数是第 (n1)/2 顺序统计量 …

图像识别网络与训练策略——基于经典网络架构训练图像分类模型

基于经典网络架构训练图像分类模型 总体框架 数据预处理部分&#xff1a;- 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用 - 数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可 - DataLoader模块直接…

@四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!

四年级家长&#xff0c;这条香港优才计划华侨生联考捷径&#xff0c;一定要看&#xff01; 香港身份的优势有多大&#xff1f;进可参加华侨生联考400分上内地985/211大学&#xff0c;退可参加香港DSE轻松上香港本地大学和海外高校。 但香港身份对子女的教育优势大小&#xff0c…

C++从入门到精通——this指针

this指针 前言一、this指针的引出问题 二、this指针的特性三、例题什么时候会出现编译报错什么时候会出现运行崩溃this指针存在哪里this指针可以为空吗 四、C语言和C实现Stack的对比C语言实现C实现 前言 this指针是一个特殊的指针&#xff0c;在C类的成员函数中使用。它指向调…

PPT 操作

版式 PPT中&#xff0c;巧妙使用母版&#xff0c;可以提高效率。 双击母版&#xff0c;选择其中一个版式&#xff0c;插入装饰符号。 然后选择关闭。 这个时候&#xff0c;在该版式下的所有页面&#xff0c;就会出现新加入的符号。不在该版式下的页面&#xff0c;不会出现新加…

【Redis】Redis的使用

登录redis [roottest2 ~]# redis-cli 127.0.0.1:6379> 或[roottest2 ~]# redis-cli -h 192.168.67.12 -p 6379 192.168.67.12:6379> redis-benchmark 测试工具 redis-benchmark 是官方自带的Redis性能测试工具&#xff0c;可以有效的测试Redis服务的性能 基本的测试语…

2.类与对象(上篇)

1.面向过程和面向对象初步认识 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 2.类的引入 C**语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定…

(三)LTspice学习交流分析

文章目录 前言一、Edit simulation cmd二、添加激励总结 前言 上一节我们学习了LTspice的安装&#xff0c;很简单&#xff0c;无脑安装 &#xff08;一&#xff09;LTspice简介 &#xff08;二&#xff09;LTspice学习之简介2 今天我们来学习一下LTspice另一个非常重要的仿真功…

血泪教训!程序员副业接单做私活避坑指南!!!

缘起 经常有粉丝朋友向我哭诉留言&#xff0c;告知大白自己兼职被骗的经历&#xff1a; 在大家找兼职踩坑过程中&#xff0c;我总结下来就是以下几点血泪教训&#xff1a; 1. 有没有靠谱兼职推荐&#xff1f; 2. 零基础怎么兼职接单&#xff1f; 3. 怎么渗透&#xff1f;怎么…

C++设计模式:桥模式(五)

1、定义与动机 桥模式定义&#xff1a;将抽象部分&#xff08;业务功能&#xff09;与实现部分&#xff08;平台实现&#xff09;分离&#xff0c;使他们可以独立地变化引入动机&#xff1a; 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;…

2.k8s架构

目录 k8s集群架构 控制平面 kube-apiserver kube-scheduler etcd kube-controller-manager node 组件 kubelet kube-proxy 容器运行时&#xff08;Container Runtime&#xff09; cloud-controller-manager 相关概念 k8s集群架构 一个Kubernetes集群至少包含一个控制…

飞书API(3):Python 自动读取多维表所有分页数据的三种方法

上一小节介绍了怎么使用 Python 读取多维表的数据&#xff0c;看似可以成功获取到了所有的数据&#xff0c;但是在实际生产使用过程中&#xff0c;我们会发现&#xff0c;上一小节的代码并不能获取到所有的多维表数据&#xff0c;它只能获取一页&#xff0c;默认是第一页。因为…

MySQL的存储引擎、索引与事务

常见的端口号 MySQL–3306http–80https–443tcp–23fcp–21tomcat–8080ssh–22oracle–1521rockermq–9876 存储引擎 使用指令查看所有引擎&#xff1a; show engines;从图中可以看出MySQL默认的存储引擎是InnoDB&#xff1b;并且在5.7版本所有的存储引擎中只有 InnoDB 是…

亮数据----教你轻松获取数据

文章目录 1. 数据采集遇到的瓶颈1.1 不会造数据&#xff1f;1.2 不会写爬虫代码&#xff1f; 2.IP 代理基础知识2.1 基本概念2.2 作用和分类2.3 IP 代理的配置和使用2.4 安全和合规 3. 为何使用亮数据 IP 代理3.1 拥有丰富的代理网络服务3.2 简单易操作的采集工具3.3 拥有各平台…

路由器对数据包的处理过程分析笔记

虽然TCP-IP协议中传输数据会在各个路由器再次经过物理层、链路层、网络层的解封装、加工、封装、转发&#xff0c;但是对于两个主机间的运输层&#xff0c;在逻辑上&#xff0c;应用进程是直接通信的。 路由器主要工作在网络层&#xff0c;但它也涉及到物理层和链路层的一些功能…

PWM 脉宽跟随方案介绍

1. 前言 数字电源产品在使用桥式电路拓扑或是多路交错控制中&#xff0c;有时会需要滞后臂的 PWM 脉宽严格跟随超前臂的 PWM 脉宽&#xff0c;或从路的 PWM 脉宽严格跟随主路的 PWM 脉宽&#xff0c;本文将介绍如何利用高精度定时器实现 PWM 输出脉宽跟随&#xff0c;一种使用…

ai智能电销机器人的核心技术,工作原理和作用

科技快速发展的同时&#xff0c;带来了人工智能产品的普及。而ai智能电销机器人则成为推进电销行业的产物&#xff0c;那么ai智能电销机器人是如何帮助企业高效触客&#xff0c;有效地工作&#xff0c;效果又如何呢&#xff1f;我们一起来看看吧&#xff01; 一、ai智能电销机器…

软件的生命周期_瀑布模型

瀑布模型 描述软件生成到消亡的过程模型图 该模型目前实际工作中已不常用&#xff0c;但是该模型是其他新型模型的“鼻祖 瀑布模型的优点 每个阶段比较清楚&#xff0c;并且有对应的文档产生 当前一个阶段完成后&#xff0c;才开始后面的阶段&#xff08;一次性的&#xff09…