布隆过滤器原理(有眼睛就能看懂)

布隆过滤器原理(有眼睛就能看懂)啊哈 布隆过滤器 你值得拥有

作用嘛就是用来过滤非法key,避免缓存穿透(请求直接打到数据库),布隆过滤器底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大

先贴demo后BB

public class MyBloomFilter { 
    //后面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 MyBloomFilter() { 
    } public MyBloomFilter(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) { 
    Arrays.stream(ints).forEach(i -> 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) { 
    MyBloomFilter bf = new MyBloomFilter (); bf.add("张学友"); bf.add("郭德纲"); bf.add("蔡徐鸡"); bf.add(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("蔡徐老母鸡"));//false System.out.println(bf.contain(666));//true System.out.println(bf.contain(888));//false } 

原理

通过对比hash算法计算出来的下标,注意,我们是对比一组,而不是只看一次,一次hash结果对应一个下标

把同一个key进行多次hash运算,将hash出来的下标放入数组,数组默认全为0,放入元素后该下标就为1,后面判断是否存在元素的时候也是进行同样次数的hash运算,看下结果对应的所有下标是否全为1,若全为1,则代表该key可能存在,若存在不为1的,则说明该key一定不存在;

相反,如果某个key计算出来的下标为[1,0,1,0,0,1],只能说这个key可能存在,因为这个位置可能是其它key计算出来的

如果对上面的hash算法有疑惑,请移步帮你真正理解hashCode和hash算法


demo复制可用,家里有条件的都在编译器上跑一跑,测一测

ok我话讲完

嘤嘤嘤~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204443.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:17
下一篇 2026年3月19日 下午8:17


相关推荐

  • rsyslogd -n_Syslog

    rsyslogd -n_Syslogimjournal模块提供将结构化日志消息从systemd日志导入syslog的功能。默认配置:module(load=”imjournal”#providesaccesstothesystemdjournalStateFile=”imjournal.state”)#Filetostorethepositioninthejournal有时需要禁止限速:module(load=”imjournal”Ratelimit.Interv

    2022年8月15日
    6
  • windows 查看局域网内所有已使用的IP

    windows 查看局域网内所有已使用的IP有时候我们会存在着这么一个问题 那就是在不能进入路由器的情况下 想查看当前局域网络中有哪些 ip 可以使用 有哪些 ip 已经被占用了 下面就教大家通过几个简单的命令实现该功能 第一步 鼠标右击电脑左下角的 开始 图标 然后再点击 运行 第二步 在运行窗口里输入 CMD 点击 确定 第三步 在 cmd 命令窗口输入 ipconfig 命令 按下键盘上的回车键第四步 这时会在 cmd 命

    2026年3月19日
    2
  • 小菜鸟 学MQ(二)

    小菜鸟 学MQ(二)

    2021年8月25日
    55
  • flex布局水平垂直居中

    flex布局水平垂直居中在 flex 布局中 子元素的属性代码写在父盒子里面 并且 flex 布局中任何元素都可以设置大小 居中的思路就是分清楚主轴 justify content 和侧轴 align items 都设置为 center 即可 代码如下 DOCTYPE tml htmllang en head metacharset UTF 8 metacharset UTF 8 head htmllang en

    2026年3月20日
    2
  • 开源许可证的选择

    开源许可证的选择

    2021年8月15日
    64
  • VGGNet笔记

    VGGNet笔记转自 https blog csdn net muyiyushan article details 简介 VGGNet 由牛津大学的视觉几何组 VisualGeomet 提出 是 ILSVRC 2014 中定位任务第一名和分类任务第二名 其突出贡献在于证明使用很小的卷积 3 3 增加网络深度可以有效提升模型的效果 而且 VGGNet 对其他数据集具有很好的泛化能力

    2026年3月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号