当前位置: 首页 > ai >正文

布隆过滤器与哈希 用Java手写一个简单的布隆过滤器

布隆过滤器时检查数据是否出现过的一种方法

核心是哈希

如果布隆过滤器返回 true 说明数据可能出现过

如果布隆过滤器返回 false 说明数据一定没出现过

import java.util.BitSet;
import java.util.Scanner;public class MyBloomFilter {/*** 位数组的大小*/private static final int DEFAULT_SIZE = 2 << 24;/*** 通过这个数组可以创建 6 个不同的哈希函数*/private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};/*** 位数组。数组中的元素只能是 0 或者 1*/private BitSet bits = new BitSet(DEFAULT_SIZE);/*** 存放包含 hash 函数的类的数组*/private SimpleHash[] func = new SimpleHash[SEEDS.length];/*** 初始化多个包含 hash 函数的类的数组,每个类中的 hash 函数都不一样*/public MyBloomFilter() {// 初始化多个不同的 Hash 函数for (int i = 0; i < SEEDS.length; i++) {func[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);}}/*** 添加元素到位数组*/public void add(Object value) {for (SimpleHash f : func) {bits.set(f.hash(value), true);}}/*** 判断指定元素是否存在于位数组*/public boolean contains(Object value) {boolean ret = true;for (SimpleHash f : func) {ret = ret && bits.get(f.hash(value));}return ret;}/*** 静态内部类。用于 hash 操作!*/public static class SimpleHash {private int cap;private int seed;public SimpleHash(int cap, int seed) {this.cap = cap;this.seed = seed;}/*** 计算 hash 值*/public int hash(Object value) {int h;return (value == null) ? 0 : Math.abs((cap - 1) & seed * ((h = value.hashCode()) ^ (h >>> 16)));}}public static void main(String[] args) {// 布隆过滤器MyBloomFilter myBloomFilter=new MyBloomFilter();Scanner sc=new Scanner(System.in);System.out.println("请输入要进行的测试用例");int t=sc.nextInt();for (int i = 0; i < t; i++) {int num=sc.nextInt();if(myBloomFilter.contains(num)==true){System.out.println("数据可能已经出现过");}else{System.out.println("数据没有出现");}myBloomFilter.add(num);}}}
http://www.xdnf.cn/news/1334.html

相关文章:

  • MCP 基于 TypeScript 的完整示例,包含stdio、sse多种用法和调试,对于构建自己的API工具链很有用
  • Spring JDBC 的开发步骤(注解方式)
  • LLama-factory微调和推理过程
  • 分布式理论和事务
  • OpenCV 中的角点检测方法详解
  • 3DGS之齐次坐标
  • 【Java面试笔记:基础】13.谈谈接口和抽象类有什么区别?
  • 基于nodeJS代码的通过爬虫方式实现tiktok发布视频(2025年4月)
  • 云原生时代的双轮驱动
  • 基于GMM的语音识别
  • 抱佛脚之学SSM五
  • Linux之彻底掌握防火墙-----安全管理详解
  • 【KWDB 创作者计划】_上位机知识篇---MQTT协议
  • 软考资料分享
  • K8S安全认证
  • 【论文阅读】Hierarchical Group-Level Emotion Recognition
  • 国产RK3568+FPGA以 ‌“实时控制+高精度采集+灵活扩展”‌ 为核心的解决方案
  • 远程控制Firefox浏览器实例的挑战与Playwright的CDP和Selenium Marionette解决方案
  • Python中的“,”
  • 【OceanBase相关】02-OceanBase数据库NFS备份实践
  • C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
  • ADW600防护等级与电气安全设计要点详解
  • 深入探究Linux项目自动化构建工具:make与Makefile
  • Kafka 主题设计与数据接入机制
  • windos端远程控制ubuntu运行脚本程序并转发ubuntu端脚本输出的网页
  • Uniapp 中缓存操作指南
  • 【笔记】CentOS7部署K8S集群
  • unity编辑器的json验证及格式化
  • 明远智睿2351开发板:性价比之选,赋能智能硬件创新
  • QT6 源(45):分隔条 QSplitter 允许程序的用户修改布局,程序员使用 IDE时,就是分隔条的用户,以及其 QSplitter 源代码