对Redis布隆过滤器的实现

2023-05-16

目录

 实现思路

首先最重要的自定义hash()

然后就是将key放入bitSet

然后就是判断布隆过滤器bitSet数组中是否含有对应的key

代码


 

 实现思路

(39条消息) Redis布隆过滤器_Fairy要carry的博客-CSDN博客

首先最重要的自定义hash()

1.首先判断key是否为null,否则返回0——>2.然后数组长度-1-i(目的使散列均匀,因为我们定义一个数组,全是辅助多次hash,所以需要-i保留特点),然后就是(size-1-i)&((h=key.hashcode())^h>>>16)——>3.非常关键在这里,计算key的hash值后,然后^key的hash>>>16,目的是保留key的特点,保证散列均匀,因为size-1-i(像hashMap默认size为16,那么15对应的二进制为1111,那么就只能与hash的低位四个进行运算,那么保留特点就很少),所以>>>16保留了key hash低位16的特点,然后再^key.hashCode()->保证了高位16的特点(这样就保证了key的特点)

private int hash(Object key, int i) {
        int h;
        //BloomFilter_Size-i归根结底是为了保证散列均匀,保证每一次hash后key的特点——>之前push也是对key进行多次hash
        int index = key == null ? 0 : (BloomFilter_Size - 1 - i) & ((h = key.hashCode()) ^ (h >>> 16));
        return index > 0 ? index : -index;
    }

然后就是将key放入bitSet

思路:1.计算key的hash(利用辅助hash数组对key进行多次hash),得到位置index后放入数组

/**
     * 2.存放key
     * 思路:1.遍历布隆过滤器的hash数组,对key进行多次hash并且保存在BitSet数组中
     *
     * @param key
     */
    public void push(Object key) {
        Arrays.stream(HelperBloom).forEach(i -> bitSet.set(hash(key, i)));
        currentBaseBean++;
    }

然后就是判断布隆过滤器bitSet数组中是否含有对应的key

思路:1.一样的,这里巧妙的是利用了&&,因为我们对key进行了多次hash,所以我们遍历辅助hash数组进行多次hash,根据对应index位置从bitSet取出看是否能取出,若为false,那么后面全为false——>2.直接利用&&,result默认为true,&&有一个为false那么结果就是false

 /**
     * 3.计算key的hash值并且去bitSet寻找看是否有位置,如果有返回true
     * 思路:利用&&,从bitSet取出对应key的hash的index,如果没有返回false,因为&&所以结果false
     *
     * @param key
     * @return
     */
    public boolean isContain(Object key) {
        boolean result=true;
        for (int i : HelperBloom) {
            result = result && bitSet.get(hash(key, i));
        }
        return result;
    }

代码

import java.util.Arrays;
import java.util.BitSet;

/**
 * @author diao 2022/9/7
 */
public class BloomFilter {
    //后面hash函数会用到,用来生成不同的hash值,可以随便给,但别给奇数
    private final int[] ints = {6, 8, 16, 38, 58, 68};
    private Integer currentBeanCount = 0;
    //你的布隆过滤器容量
    private int DEFAULT_SIZE = Integer.MAX_VALUE;
    //bit数组,用来存放结果
    private final BitSet bitSet = new BitSet(DEFAULT_SIZE);

    public BloomFilter() {
    }

    public BloomFilter(int size) {
        if (size <= (2 << 8)) {
            throw new RuntimeException("size is too small");
        }
        DEFAULT_SIZE = size;
    }

    //获取当前过滤器的对象数量
    public Integer getCurrentBeanCount() {
        return currentBeanCount;
    }

    //计算出key的hash值,并将对应下标置为true
    public void push(Object key) {
        for (int i : ints) {
            bitSet.set(hash(key, i));
        }
        currentBeanCount++;
    }

    //判断key是否存在,true不一定说明key存在,但是false一定说明不存在
    public boolean contain(Object key) {
        boolean result = true;
        for (int i : ints) {
            result = result && bitSet.get(hash(key, i));
        }
        return result;
    }

    //hash算法,借鉴了hashmap的算法
    private int hash(Object key, int i) {
        int h;
        int index = key == null ? 0 : (DEFAULT_SIZE - 1 - i) & ((h = key.hashCode()) ^ (h >>> 16));
        return index > 0 ? index : -index;
    }

    public static void main(String[] args) {
        BloomFilter bf = new BloomFilter ();
        bf.push("张学友");
        bf.push("郭德纲");
        bf.push("特雷杨");
        bf.push(666);
        System.out.println(bf.contain("张学友"));//true
        System.out.println(bf.contain("张学友 "));//false
        System.out.println(bf.contain("张学友1"));//false
        System.out.println(bf.contain("郭德纲"));//true
        System.out.println(bf.contain("老鹰特雷杨8"));//false
        System.out.println(bf.contain(666));//true
        System.out.println(bf.contain(888));//false
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对Redis布隆过滤器的实现 的相关文章

  • Linux 6.1/6.2发布新补丁:缓解AMD处理器fTPM间歇性卡顿问题

    导读早些时候 xff0c AMD承认 xff0c 在Linux系统中开启AMD锐龙处理器的fTPM xff0c 将可能导致系统出现间歇性的卡顿 死机等情况 据悉 xff0c 该Bug在Linux 6 1内核中表现得最为明显 xff0c 这是
  • 完美解决主机与虚拟机相互通信,相互ping等问题

    笔者最近在学习使用linux时 xff0c 使用到了vm virtue box的虚拟机服务来简单的安装linux xff0c 但是在使用的时候发现了一个严重的问题 xff1a 虚拟机可以ping通主机 xff0c 主机却无法ping通虚拟机
  • CSS——CSS的选择器

    概念 xff1a CSS在渲染 HTML 页面是 xff0c 为了得到 HTML 中的标签进行样式渲染 xff0c 为我们提供了大量好用的各种选择器 xff0c 以便于我们在CSS 中拿到 HTML 的标签进行样式设置 一 基本选择器 基本
  • OA工作流的浅谈

    如今 xff0c 越来越多的人意识到将工作流引入解决方案的重要性 随着信息技术的发展和商业竞争的日益激烈 xff0c 人们不再满足于独立 分散的办公自动化和计算机应用 xff0c 而需要全面 集成的解决方案 作为一种管理和集成常规事务的技术
  • GPG key retrieval failed: [Errno 14] curl#60 - “Peer‘s Certificate has expired.“

    GPG key retrieval failed Errno 14 curl 60 Peer s Certificate has expired GPG key retrieval failed Errno 14 curl 60 Peer
  • html,css常见的几种垂直居中方式

    一丶什么是垂直居中 指当前标签在父级容器中垂直方向是居中显示的 实现垂直居中的几种方式 xff1a 1 table cell 43 vertical align 属性配合使用 2 absolute 43 transform 属性配合使用 3
  • STM32用XCOM调试助手打印不出数据

    STM32用XCOM调试助手打印不出数据 被困扰了一段时间的串口终于解决了 xff0c 用STM332F103ZET6写串口 xff0c 但是不懂为什么打开串口调试助手就是打印不出数据 首先检查了代码有没有错 xff0c 因为是按照网上的代
  • 基于蚁群算法的机器人路径规划matlab——代码注释超级详细,都能看懂

    采用蚁群算法路径规划matlab 本文对基本蚁群算法代码进行了详细的注释 每一步都简单易懂 程序在matlab中可直接运行 适合刚开始学习本算法的同学入门 蚁群算法是由意大利学者Dorigo提出的一种仿生智能算法 最早运用在旅行商问题上 蚁
  • java集合类(collection)

    一 集合类 collection Java中有哪些容器 xff08 集合类 xff09 Java中的集合类主要由Collection和Map这两个接口派生而出 xff0c 其中Collection接口又派生出三个子接口 xff0c 分别是S
  • linux安装程序和软件

    文章目录 一 解析Linux应用软件安装包二 rpm命令2 1 安装有依赖关系的 rpm软件包 xff0c 2 2 升级或更新 rpm软件包2 3 实列2 4 查询未安装的 rpm软件包文件 一 解析Linux应用软件安装包 通常Linux
  • Postman入门教程【没有废话,直入实战,绝对给力!】

    基础篇 Postman功能 xff08 https www getpostman com features xff09 主要用于模拟网络请求包快速创建请求回放 管理请求快速设置网络代理安装 下载地址 xff1a https www getp
  • U3D开发的逆天级大型游戏有哪些

    1 World of Diving 潜水世界 一款潜水游戏 潜水世界 xff1a http dx60 downyouxi com qianshuishijie zip 氛围不错 xff0c 不过细看建模好像不是特别精细的样子 2 The F
  • 线程安全(实现线程方式+线程状态+通信方式,sleep,wait,守护线程)

    目录 用户自定义线程 Java中实现多线程的方法 xff1a 如何停止一个正在运行的线程 1 说说什么是线程安全 xff1f 如何实现线程安全 xff1f 2 Java中线程的状态有哪些 xff1f 线程间的通信方式有哪些 xff1f 追问
  • LINUX——远程访问控制ssh

    文章目录 一 什么是SSH xff1f 二 SSH远程管理 服务端2 1 SSH协议2 2服务监听选项2 3用户登录控制 Authentication xff1a 2 4登录验证方式 三 TCP Wrappers控制3 1 2保护机制的实现
  • 关于Visual studio 2010运行时闪退问题的解决

    在运行一个刚刚下载的visual studio 2010时候 xff0c 编程一个简单程序进行输出时候 xff0c 会出现闪退状况 明明成功编译了 xff0c 但是没有显示结果 xff0c 只是闪了一下就自己关闭了 解决方法1 在main函
  • GFF/GTF简介及格式转换

    最近做转录组的比对时 xff0c 在建立索引过程中 xff0c 遇见一个问题 xff0c 就是我从ncbi下载的序列文件和gtf文件中 xff0c 染色体命名规则竟然不一样 xff0c 但序列文件和gff文件染色体命名规则是一样的 xff0
  • Linux 系统上安装R及加载R包

    因为安装Hic Pro xff0c 需要依赖几个R包 xff0c 比如ggplot2 又依赖 gt 4 0的R xff0c 之前安的3 6 xff0c 再重新安装一遍最新的吧 xff0c 记录一下 xff0c 省去了以后再重复查资料的过程
  • BWA比对及Samtools提取目标序列

    今天想看一下自己的序列里面会不会有某细菌基因组存在 xff0c 主要使用BWA和Samtools xff1a bwa主要用于将低差异度的短序列与参考基因组进行比对 主要包含三种比对算法 xff1a backtrack SW和MEM xff0
  • 核糖体rRNA分类-功能应用-数据库-Silva

    一 xff0e 分类 xff1a 原核生物的rRNA分三类 xff1a 5SrRNA 16SrRNA和23SrRNA 真核生物的rRNA分四类 xff1a 5SrRNA 5 8SrRNA 18SrRNA和28SrRNA S为大分子物质在超速
  • RepeatMasker基因组重复序列检测工具安装及使用

    一 RepeatMasker简介 基因组组装完成后 xff0c 进行基因预测和注释 由于基因组中存在重复序列结构区 xff0c 特别是高等真核生物 xff0c 重复序列占了相当大的比例 xff0c 会影响基因预测的质量 xff0c 也会带来

随机推荐

  • Seqkit:强大的序列处理工具

    Seqkit是一款专门处理fsata q序列文件的软件 github地址 https github com shenwei356 seqkit 下载地址 xff1a https bioinf shenwei me seqkit downlo
  • Minimap2:三代比对工具

    在使用Purge dups去冗余时 xff0c 用到了Minimaps2 xff0c 把学习的东西整理一下 先声明本文软件介绍的很多内容来自 生信算法 公众号文章 xff0c 用来作为自己的学习记录 xff0c 原文作者若不同意的话就删稿
  • 白盒测试:语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、组合覆盖、路径覆盖

    语句覆盖 xff1a 所有的 语句 都要覆盖一遍 判定覆盖 xff1a 包含语句覆盖 xff0c 每个判断T F各一次 条件覆盖 xff1a 包含语句覆盖 xff0c 每个条件T F各一次 判定条件覆盖 xff1a 包含判定覆盖 条件覆盖
  • GMAP一款比对工具用于ALLHiC构建等位基因表

    在ALLHiC使用过程中需要构建Allele ctg table xff0c 用于过滤多倍体基因组中因等位序列相似引起的HiC噪音的必要输入 官网提供了两种办法 xff0c 一种是blastn xff0c 需要对草图基因组进行注释 xff0
  • 数据结构——平衡二叉树(AVL树)之插入

    文章目录 前言一 定义二 基本操作1 查找 xff0c 2 插入 如何调整 如何调整代码实现插入 前言 首先我们来思考一下一个普通二叉树保存数据 xff0c 如果想查找一个数据 xff0c 由于普通二叉树保存数据是随机的 xff0c 要找到
  • C++之引用怎么用

    1 引用的概念 引用并不是新定义一个变量 xff0c 而是给一个已存在的变量取一个别名 编译器并不会为引用变量开辟空间 xff0c 它和它应用的变量共用一块空间 也就是说引用是同一块变量空间的不同名字 格式 xff1a 类型 amp 引用变
  • 完全背包问题

    目录 一 什么是完全背包 二 完全背包问题的里外层循环可以交换吗 三 题 3 1 求组合数 3 2 求排列和 3 3 求最小值 一 什么是完全背包 完全背包问题一般是指 xff1a 有N件物品和一个能背重量为W的背包 xff0c 第i件物品
  • 如何从GitHub上下载开源项目

    作为开源代码库以及版本控制系统 xff0c Github拥有超过900万开发者用户 随着越来越多的应用程序转移到了云上 xff0c Github已经成为了管理软件开发以及发现已有代码的首选方法 GitHub上有无数优秀开发者正在开发和维护的
  • 进程间通信之共享内存

    目录 一 共享内存实现进程间通信的原理 二 管理共享内存的数据结构 三 共享内存函数 四 实现进程间通信 接博客 xff1a 进程间通信之管道 一 共享内存实现进程间通信的原理 共享内存实际是操作系统在实际物理内存中开辟的一段内存 共享内存
  • ICMP协议详解

    ICMP协议 一 概念 ICMP协议是一个网络层协议 和IP协议处于同一层 xff0c 但是ICMP协议底层用的是IP协议 一个搭建好的网络 xff0c 往往需要先进行简单的测试 xff0c 来验证网络是否通畅 单单使用IP协议并不提供可靠
  • C++11——右值引用

    目录 前言 一 右值引用的概念 1 1 左值和右值的概念 1 2 引用和右值引用比较 二 右值引用的作用 2 1引用的缺陷 2 1 移动语义 2 2 右值引用的具体应用 2 3 对比引用总结 三 右值引用引用左值 move 四 完美转化 前
  • C++11——lambda表达式

    目录 前言 一 lambda表达式用法 二 lambda表达式语法 三 lambda表达式的原理 前言 在显示生活中 xff0c 我们在用手机购物时 总是可以在页面上看到下面这样的选项 我们知道底层这是通过排序来完成的 xff0c 但是当我
  • MySQL索引

    目录 前言 一 认识磁盘 二 MySQL与磁盘的交互基本单位 三 索引的理解 3 1 引出索引 3 2 MySQL管理Page 3 2 1 单个Page的情况 3 2 2 多page的情况 3 3 什么是索引 四 聚簇索引和非聚簇索引 4
  • 100道测试工程师笔试的Linux笔试题及答案

    单选题 xff1a 1 cron 后台常驻程序 daemon 用于 xff1a A 负责文件在网络中的共享 B 管理打印子系统 C 跟踪管理系统信息和错误 D 管理系统日常任务的调度 2 在大多数Linux发行版本中 xff0c 以下哪个属
  • Redis应用问题及解决

    目录 一 缓存穿透 1 1 问题描述 1 2 解决方案 二 缓存击穿 2 1 问题描述 2 2 解决方案 三 缓存雪崩 3 1 问题描述 3 2 解决方案 当数据库压力变大 xff0c 导致服务访问数据库响应变慢 xff0c 导致服务的压力
  • Shell脚本练习

    求100以内正奇数和 注意点 xff1a 和 xff1a 是进行数学运算的 支持 43 xff1a 分别为 加 减 乘 除 取模 但是注意 xff0c bash只能作整数运算 xff0c 对于浮点数是当作字符串处理的 a b xff1a 表
  • sed命令_Linux sed命令:替换、删除、更新文件中的内容

    sed 是 stream editor 的缩写 xff0c 中文称之为 流编辑器 sed 命令是一个面向行处理的工具 xff0c 它以 行 为处理单位 xff0c 针对每一行进行处理 xff0c 处理后的结果会输出到标准输出 xff08 S
  • 《国产操作系统之银河麒麟》银河麒麟服务器操作系统引导过程

    目录 系统引导过程 01 系统启动流程概述 系统启动总流程 第一阶段 xff1a BIOS初始化 编辑 第二阶段 GRUB2启动引导 编辑 第三阶段 内核引导 编辑 第四阶段 systemd进程 02 固件与BIOS BIOS启动流程 BI
  • Spring MVC基础配置

    Spring MVC 使用步骤 xff1a 1 在web xml中的配置DispatcherServlet span class token tag span class token tag span class token punctua
  • 对Redis布隆过滤器的实现

    目录 实现思路 首先最重要的自定义hash 然后就是将key放入bitSet 然后就是判断布隆过滤器bitSet数组中是否含有对应的key 代码 实现思路 39条消息 Redis布隆过滤器 Fairy要carry的博客 CSDN博客 首先最