首页 > 其他分享 >布谷鸟过滤器核心代码

布谷鸟过滤器核心代码

时间:2023-06-28 09:55:33浏览次数:35  
标签:布谷鸟 代码 results long writeBits tag 过滤器 curIndex executorService

private boolean writeBits(long curIndex, long tag, Boolean bitValue) {
CommandBatchService executorService = new CommandBatchService(commandExecutor);
RBitSetAsync bs = redisUtils.createBitSet(executorService);
// 判断curIndex出是否已有值
log.info("writeBits:tag-bit:{}", Long.toBinaryString(tag));
for (int i = 0; i < BUCKET_SIZE; i++) {
// todo 检查与下面的设置要加同步锁才能保证原子性,检查index出i位置是否已存在tag。与redission的bloom过滤器无需加锁不同,
// 因为它不是一个桶只存放一个元素,而是元素共用bit位,添加元素时,只要有一个bit位从0变成1,则表示添加成功,否则失败。
// 所以利用redis本身的单进程处理实现了put的原子性,而线程安全
if (isExistTag(curIndex, i, tag) == bitValue) {
log.info("writeBits:continue:{}", i);
continue;
}
long[] bitIndexes = getPosOfTrue(curIndex, i, tag);
System.out.println("writeBits:bitIndexes:" + JSON.toJSONString(bitIndexes));
for (long bitIndex : bitIndexes) {
// 将位下标对应位设置1或0
if (bitIndex != -1) {
bs.setAsync(bitIndex, bitValue);
}
}
// 返回修改前的值,若是插入值,这里应该全部返回true,否则返回false
List<Boolean> results = (List<Boolean>) executorService.execute().getResponses();
log.info("writeBits:results:{}", JSON.toJSONString(results));
// for (Boolean val : results.subList(1, results.size() - 1)) {
// if (val.equals(bitValue)) {
// isExistTag(curIndex, i, tag);
// System.out.println("writeBits:true");
// return bitValue;
// }
// }
return true;
}
// System.out.println("writeBits:false");
return false;
}

private boolean isExistTag(long curIndex, int posInBucket, long tag) {
// 检查指定桶的pos处是否存在tag
log.info("checkTag:curIndex:" + curIndex + ",posInBucket:" + posInBucket + ",tag:" + tag);
CommandBatchService executorService = new CommandBatchService(commandExecutor);
RBitSetAsync bs = redisUtils.createBitSet(executorService);
long startPos = curIndex * BUCKET_SIZE * BITS_PER_TAG + (long) posInBucket * BITS_PER_TAG;
long endPos = startPos + BITS_PER_TAG;
for (long i = startPos; i < endPos; i++) {
bs.getAsync(i);
}
List<Boolean> result = (List<Boolean>) executorService.execute().getResponses();
// System.out.println("checkTag:results:" + JSON.toJSONString(result));
for (int i = 0; i < BITS_PER_TAG; i++) {
// 比如tag=15,bit表示0000 0000 0000 1111
if (((tag & (1L << i)) == 0) == result.get(i)) {
// 有一个bit不相同,就表示不存在,返回false
return false;
}
}
// System.out.println("checkTag:results:-----------true---------------------------");
return true;
}

标签:布谷鸟,代码,results,long,writeBits,tag,过滤器,curIndex,executorService
From: https://www.cnblogs.com/chordtone/p/17510578.html

相关文章

  • 为什么现代的低代码开发平台都不支持导出源代码?
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。初次接触低代码的程序员大多会纠结一个问题,为什么功能越强大的低代码开发平台越不会提供导出源代码的功能?要想回答这个问题,我们得回顾一......
  • R语言从经济时间序列中用HP滤波器,小波滤波和经验模态分解等提取周期性成分分析|附代码
    全文下载链接:http://tecdat.cn/?p=9350最近我们被客户要求撰写关于经济时间序列的研究报告,包括一些图形和统计输出。经济时间序列的分析通常需要提取其周期性成分。这篇文章介绍了一些方法,可用于将时间序列分解为它们的不同部分 ( 点击文末“阅读原文”获取完整代码数据*******......
  • R语言Gibbs抽样的贝叶斯简单线性回归仿真分析|附代码数据
    全文下载链接:http://tecdat.cn/?p=4612最近我们被客户要求撰写关于贝叶斯简单线性回归的研究报告,包括一些图形和统计输出。贝叶斯分析的许多介绍都使用了相对简单的教学实例(例如,根据伯努利数据给出成功概率的推理)。虽然这很好地介绍了贝叶斯原理,但是这些原则的扩展并不是直截了......
  • R语言JAGS贝叶斯回归模型分析博士生延期毕业完成论文时间|附代码数据
    原文链接:http://tecdat.cn/?p=23652最近我们被客户要求撰写关于贝叶斯回归的研究报告,包括一些图形和统计输出。本文为读者提供了如何进行贝叶斯回归的基本教程。包括完成导入数据文件、探索汇总统计和回归分析 ( 点击文末“阅读原文”获取完整代码数据******** )。在本文中,我......
  • R语言使用多元AR-GARCH模型衡量市场风险|附代码数据
    原文链接:http://tecdat.cn/?p=19118最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。本文分析将用于制定管理客户和供应商关系的策略准则假设:贵公司拥有用于生产和分销聚戊二酸的设施,聚戊二酸是一种用于多个行业的化合物。制造和分销过程的投入包括各种......
  • 自定义代码片段
    前言使用自定义代码片段可以快速生成代码片段,提升开发效率。使用在vscode中ctrl+shift+p,新建全局代码片段。写好模板,复制进这个网站https://snippet-generator.app/将生成的模板复制进文件中......
  • Qemu中生成针对具体体系结构的纯净代码的方法---利用GCC的-E选项
      实验室正在研究一个叫做Qemu的项目,外国人写的初始代码。里面很多内容是我们不需要的,但是却参杂在我们关注的代码中。突然想到了一个编译命令-E,它能够一下子就把那些不需要的代码过滤掉。以前几次开会大家都抱怨这个东西干扰信息太多,导致代码分析的连贯性总是被打断,进度特别慢......
  • tcp_bbr 代码分析
     brr算法流程:bbr算是一个完全独立的拥塞算法,具有自己的拥塞状态机.tcp_cong_control函数已经被bbr_main函数接管了 staticvoidtcp_cong_control(structsock*sk,u32ack,u32acked_sacked,intflag,conststructrate_sample*rs){conststr......
  • 优维低代码实践:数据加工/转化详解
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。优维低代码实践连载第⑧期《数据加工/转化详解》▽一、表达式VisualBuild......
  • PHP代码加密实战过程 Swoole Loader
    帮一个客户处理一个小程序bug修复,前面不知道客户是直接购买一个倒闭的公司产品,还是破解版本的。其中一些核心工具类代码进行了加密,通过排查就找到了SwooleCompiler 今天演示下如何进行代码加密:大致步骤如下:注册 SwooleCompiler 账号地址:Swoole-Compiler-最佳PHP......