布谷鸟过滤器,一种增强版的布隆过滤器,不同于布隆过滤器的是,存放一段hash的地方会多个位置,用于增加空间率用率,布谷鸟过滤器会有两个hash,异或算法,两个hash能找到相互的位置,用于其中一个被布谷鸟的蛋T走时的容错。


/*** 布谷鸟过滤器* @Description: CuckooFilter* @Author: GeorgeYang* @Date: 2022-06-07* @Version:v1.0*/
public class CuckooFilter {/*** 预期处理的数据量大小*/private int dataCount;/*** 位数组的数量大小*/private int bitCount;private int bitSpace;/*** 鸟巢位置2* 位数组。数组中的元素只能是 0 或者 1*/private BitSet nestPosition1;/*** 鸟巢位置2* 位数组。数组中的元素只能是 0 或者 1*/private BitSet nestPosition2;/*** 存放包含 hash 函数的类的数组*/private SliceHash[] func;/*** 静态内部类。hash 函数* 块hash*/public static class SliceHash {private int bitIndex;//bitIndexprivate int fp;private int intSliceSpace;//hash成整数,每段长多少public SliceHash(int bitSpace, int bitIndex) {this.bitIndex = bitIndex;this.fp = bitSpace * bitIndex;this.intSliceSpace = Integer.MAX_VALUE / bitSpace;}/*** 计算 hash 值*/public int hash1(Object value) {return Math.abs(bitIndex * intSliceSpace + (value.hashCode() << bitIndex) % intSliceSpace);}public int hash2(Object value) {int hash1 = this.hash1(value);int hash2 = hash1 ^ fp;return Math.abs(hash2);}}/**** @param dataCount 预计存放总数量* @param bitSpace 每个内容,可以被拆分分散在多少个位置里面选择存放,*/public CuckooFilter(int dataCount, int bitSpace) {this.dataCount = dataCount;this.bitSpace = bitSpace;//每个字符分配32个位this.bitCount = dataCount * bitSpace;func = new SliceHash[bitSpace];//16个for (int i = 0; i < bitSpace; i++) {func[i] = new SliceHash(bitSpace, i);}this.nestPosition1 = new BitSet(bitCount);this.nestPosition2 = new BitSet(bitCount);}public boolean add(Object value) {if (contains(value))return false;for (SliceHash f : func) {int hash1 = f.hash1(value);nestPosition1.set(hash1, true);nestPosition2.set(hash1, false);//T走同巢隔壁位置的蛋int hash2 = f.hash2(value);nestPosition1.set(hash2, false);//T走同巢隔壁位置的蛋nestPosition2.set(hash2, true);}return true;}public boolean contains(Object value) {for (SliceHash f : func) {int hash1 = f.hash1(value);int hash2 = f.hash2(value);boolean inPosition1 = nestPosition1.get(hash1);boolean inPosition2 = nestPosition2.get(hash2);boolean existInOne = inPosition1 || inPosition2;if (!existInOne)//两个巢位都被T走了return false;}return true;}public static void main(String[] args) throws Exception {int dataCount = 2 << 24;
//        int dataCount = 9000000;System.out.println(dataCount);CuckooFilter filter = new CuckooFilter(dataCount, 5);int wrongCount = 0;int addCount = 9999999;//1亿数据for (int i = 0; i < addCount; i++) {String value = "" + i;boolean exist = filter.contains(value);if (exist) {wrongCount++;}boolean addSuccess = filter.add(value);exist =  filter.contains(value);if (!exist)throw new InterruptedException("添加后被认为不存在:" + value);}System.out.println("误判的数量:" + wrongCount);System.out.println("误判率:" + (wrongCount * 100d / addCount) + "%");int lostCount = 0;int existCount = 0;for (int i = 0; i < addCount; i++) {String value = "" + i;boolean exist = filter.contains(value);if (exist) {existCount++;} else {lostCount ++;}}System.out.println("存留的数量:"  + (existCount - wrongCount));System.out.println("存留率:" + ((existCount - wrongCount) * 100d / addCount) + "%");System.out.println("被T除的数量:"  + lostCount);System.out.println("丢失率:" + (lostCount * 100d / addCount) + "%");}}

测试添加1亿数据,运行结果:

误判的数量:876
误判率:0.008760000876000087%
存留的数量:9932122
存留率:99.32122993212299%
被T除的数量:67001
丢失率:0.6700100670010067%

还没有做扩容等操作,这里只是简单的实现。

参考:

https://zhuanlan.zhihu.com/p/462813998
https://blog.csdn.net/aaa_bbb_ccc_123_456/article/details/106055033

java简单实现布谷鸟过滤器的相关推荐

  1. 布隆过滤器和布谷鸟过滤器详解

    今天和大家分享下布隆过滤器和布谷鸟过滤器 一.布隆过滤器 1.简单介绍 布隆过滤器是用于检索一个元素是否在一个集合中的算法,是一种用空间换时间的查询算法. 2.实现原理 布隆过滤器的存储结构是一个bi ...

  2. java项目中布隆过滤器和布谷鸟过滤器

    布隆过滤器 布隆过滤器是一个叫"布隆"的人提出的,它本身是一个很长的二进制向量,既然是二进制的向量,那么显而易见的,存放的不是0,就是1. 现在我们新建一个长度为16的布隆过滤器, ...

  3. 过滤请求绝技,布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  4. Redis 之布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  5. 【不体系】布谷鸟过滤器

    1.概述 转载:https://mp.weixin.qq.com/s/HVb0g6w37gvn307DrnVtTg 为解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世. 论文<Cuckoo ...

  6. 为什么我加了过滤器然后就登不进去了_布隆过滤器过时了,未来属于布谷鸟过滤器?...

    为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世.论文<Cuckoo Filter:Better Than Bloom>作者将布谷鸟过滤器和布隆过滤器进行了深入的对比.相比布谷鸟 ...

  7. Redis中的布隆过滤器与布谷鸟过滤器,你了解多少?

    点击关注公众号,实用技术文章及时了解 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息 ...

  8. Redis布隆过滤器与布谷鸟过滤器

    -     目录    - 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信 ...

  9. 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)

    过滤器 位图 布隆过滤器(Bloom Filter) 布谷鸟过滤器(Cuckoo Filter) 商过滤器(quotient filter) 文章参考链接 位图 在讨论布隆过滤器之前,先看一下位图是什 ...

最新文章

  1. 数据结构显示树的所有结点_您需要了解的有关树数据结构的所有信息
  2. 时间复杂度O(n),空间复杂度O(1)的排序
  3. C语言 —— 获取字符串中两个字符之间的的数据
  4. 乐视云没创意,还拿“免费”说事儿
  5. docker环境安装redis
  6. 第四范式发布Sage AIOS 2.0及智能应用市场Sage App Store
  7. ASP.NET Core必备笔试题(含答案)
  8. Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动
  9. 通过串口来控制网管型交换机的操作步骤详解
  10. asp.net treeView绑定
  11. Java中List排序的3种方法!
  12. python重复输入字符串a三次_8道Python基础面试练习题
  13. PHP Primary script unknown 终极解决方法
  14. 查看Linux服务器raid信息笔记整理!
  15. fopen php 读取_PHP fopen读取url内容
  16. 采集的时候,列表的编码是gb2312,内容页的编码却是UTF-8,这种网站怎么采集?
  17. java项目 分模块管理_java 工程项目模块划分及各模块功能梳理
  18. 下周把交接文档做完就交接实习结束离职了
  19. 基于javaweb+jsp的员工薪资工资管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
  20. 【破解三网】iphone5 国行 A1429

热门文章

  1. java有阴历年算法吗_中国农历算法java实现
  2. 计算机程序员笔试题,历年计算机软考程序员笔试真题及答案
  3. 发送给客户的文件,怕泄漏怎么办?
  4. 【算法】独立任务最优调度问题
  5. CSAPP LAB4 键盘驱动程序的分析与修改(谢罪)
  6. adb 禁止app联网_ADB大法好!无需ROOT也可以使用APP Ops来管理手机应用权限
  7. JAVA六大设计原则 和 23种设计模式
  8. c++实现图书管理系统v2.0
  9. 什么是Web?Web Service、Web API傻傻分不清楚?
  10. 打条码软件怎样测试到纸张大小,条码标签纸规格有哪些?如何在打印机上设置打印尺寸?...