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

兴力网站建设wordpress文章类型模板

兴力网站建设,wordpress文章类型模板,宁夏网站建站,百度搜索引擎优化的方法在Java中,要实现布隆过滤器(Bloom Filter)的方式有很多种,除了上一节中通过jedis包调用安装了布隆过滤器的redis外,还有以下几种常见的实现方式: 手写布隆过滤器 基于guava包实现 通过redis的bitmaps实现…

在Java中,要实现布隆过滤器(Bloom Filter)的方式有很多种,除了上一节中通过jedis包调用安装了布隆过滤器的redis外,还有以下几种常见的实现方式:

  • 手写布隆过滤器

  • 基于guava包实现

  • 通过redis的bitmaps实现

  • 基于redisson包实现

手写布隆过滤器

手写一个布隆过滤器的源代码:

package com.morris.redis.demo.bloomfilter;import java.util.BitSet;/*** 手写一个布隆过滤器*/
public class MyBloomFilter {// 位数组的大小private static final int DEFAULT_SIZE = 2 << 24;// 哈希函数种子private static final int[] seeds = {3, 5, 7, 11, 13, 31, 37, 61};// 位数组private final BitSet bits = new BitSet(DEFAULT_SIZE);// 哈希函数数组private final SimpleHash[] func = new SimpleHash[seeds.length];// 初始化哈希函数public MyBloomFilter() {for (int i = 0; i < seeds.length; i++) {func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);}}// 添加元素public void add(String value) {for (SimpleHash f : func) {bits.set(f.hash(value), true);}}// 判断元素是否存在(可能误判)public boolean contains(String value) {boolean ret = true;for (SimpleHash f : func) {ret = ret && bits.get(f.hash(value));if (!ret) return false;}return true;}// 静态内部类,实现简单的哈希函数private static class SimpleHash {private final int cap;private final int seed;public SimpleHash(int cap, int seed) {this.cap = cap;this.seed = seed;}public int hash(String value) {int h = 0;int len = value.length();for (int i = 0;i < len;i++){h = seed * h + value.charAt(i);}return (cap - 1) & h;}}}

手写一个布隆过滤器的使用:

package com.morris.redis.demo.bloomfilter;/*** 手写一个布隆过滤器的使用*/
public class MyBloomFilterDemo {public static void main(String[] args) {MyBloomFilter filter = new MyBloomFilter();filter.add("hello");System.out.println(filter.contains("hello")); // trueSystem.out.println(filter.contains("world")); // 可能为false,也可能为误判的true}
}

基于guava包实现

先添加maven依赖:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.3.1-jre</version>
</dependency>

guava包中布隆过滤器的使用源码如下:

package com.morris.redis.demo.bloomfilter;import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;import java.nio.charset.Charset;/*** guava包中布隆过滤器的使用*/
public class GuavaBloomFilterDemo {public static void main(String[] args) {// 创建布隆过滤器对象BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 10000, 0.001);bloomFilter.put("10080");bloomFilter.put("10081");bloomFilter.put("10082");bloomFilter.put("10083");bloomFilter.put("10084");bloomFilter.put("10085");bloomFilter.put("10086");System.out.println(bloomFilter.mightContain("10086")); // trueSystem.out.println(bloomFilter.mightContain("10089")); // false}
}

通过redis的bitmaps实现

使用redis的bitmaps实现布隆过滤器源码如下:

package com.morris.redis.demo.bloomfilter;import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;/*** 使用redis的bitmaps实现布隆过滤器*/
public class RedisBloomFilter {private final Jedis jedis;private final String redisKey;private final int bitArraySize;private final int hashCount;private final int[] hashSeeds;/*** 构造布隆过滤器** @param redisHost         Redis主机地址* @param redisPort         Redis端口* @param redisKey          存储位数组的Redis键* @param expectedElements  预期元素数量* @param falsePositiveRate 可接受的误判率(0.0到1.0之间)*/public RedisBloomFilter(String redisHost, int redisPort, String redisKey,int expectedElements, double falsePositiveRate) {this.jedis = new Jedis(redisHost, redisPort);this.redisKey = redisKey;this.bitArraySize = calculateOptimalSize(expectedElements, falsePositiveRate);this.hashCount = calculateOptimalHashCount(bitArraySize, expectedElements);this.hashSeeds = generateHashSeeds(hashCount);}// 计算最优位数组大小private int calculateOptimalSize(int n, double p) {return (int) Math.ceil(-n * Math.log(p) / (Math.log(2) * Math.log(2)));}// 计算最优哈希函数数量private int calculateOptimalHashCount(int m, int n) {return Math.max(1, (int) Math.round((double) m / n * Math.log(2)));}// 生成哈希种子(简单实现,实际可能需要更复杂的种子)private int[] generateHashSeeds(int count) {int[] seeds = new int[count];for (int i = 0; i < count; i++) {seeds[i] = 31 * (i + 1); // 使用质数生成种子}return seeds;}/*** 添加元素到布隆过滤器** @param element 要添加的元素*/public void add(String element) {byte[] bytes = element.getBytes(StandardCharsets.UTF_8);try (Pipeline pipeline = jedis.pipelined()) {for (int seed : hashSeeds) {long hash = murmurHash(bytes, seed);long bitOffset = (hash & Long.MAX_VALUE) % bitArraySize;pipeline.setbit(redisKey, bitOffset, true);}pipeline.sync();}}/*** 检查元素是否存在** @param element 要检查的元素* @return true表示可能存在,false表示一定不存在*/public boolean mightContain(String element) {byte[] bytes = element.getBytes(StandardCharsets.UTF_8);List<Long> offsets = new ArrayList<>(hashSeeds.length);// 计算所有位偏移量for (int seed : hashSeeds) {long hash = murmurHash(bytes, seed);long bitOffset = (hash & Long.MAX_VALUE) % bitArraySize;offsets.add(bitOffset);}// 使用管道批量查询try (Pipeline pipeline = jedis.pipelined()) {List<Response<Boolean>> responses = new ArrayList<>();for (Long offset : offsets) {responses.add(pipeline.getbit(redisKey, offset));}pipeline.sync();// 检查所有位是否都为1for (Response<Boolean> response : responses) {if (!response.get()) {return false;}}return true;}}// 使用MurmurHash3算法计算哈希值private long murmurHash(byte[] data, int seed) {HashFunction hashFunction = Hashing.murmur3_128(seed);HashCode hashCode = hashFunction.hashBytes(data);return hashCode.asLong();}/*** 关闭Redis连接*/public void close() {jedis.close();}}

使用redis的bitmaps实现布隆过滤器的使用:

package com.morris.redis.demo.bloomfilter;/*** 使用redis的bitmaps实现布隆过滤器 的使用*/
public class RedisBloomFilterDemo {public static void main(String[] args) {// 示例用法RedisBloomFilter filter = new RedisBloomFilter("localhost", 6379, "myBloomFilter", 1000000, 0.01);filter.add("hello");System.out.println(filter.mightContain("hello")); // trueSystem.out.println(filter.mightContain("world")); // 可能为false,也可能为误判的truefilter.close();}
}

基于redisson包实现

先添加maven依赖:

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.23.4</version>
</dependency>

Redisson包中布隆过滤器的使用:

package com.morris.redis.demo.bloomfilter;import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;/*** redisson包中布隆过滤器的使用*/
public class RedissonBloomFilterDemo {public static void main(String[] args) {// 配置Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 创建Redisson客户端实例RedissonClient redisson = Redisson.create(config);// 获取或创建布隆过滤器RBloomFilter<String> bloomFilter = redisson.getBloomFilter("userEmails");// 初始化布隆过滤器(重要!)// expectedInsertions: 预期插入数量// falseProbability: 误判率(0.0-1.0)bloomFilter.tryInit(1000000L, 0.01);// 添加元素bloomFilter.add("user1@example.com");bloomFilter.add("user2@example.com");// 检查元素是否存在System.out.println(bloomFilter.contains("user1@example.com")); // trueSystem.out.println(bloomFilter.contains("unknown@test.com"));  // false// 关闭客户端redisson.shutdown();}
}

布隆过滤器的配置会在redis中生成一个key:

127.0.0.1:6379> hgetall {userEmails}:config
1) "size"
2) "9585058"
3) "hashIterations"
4) "7"
5) "expectedInsertions"
6) "1000000"
7) "falseProbability"
8) "0.01"
http://www.dtcms.com/a/418149.html

相关文章:

  • springboot高校教务管理系统设计与实现(代码+数据库+LW)
  • Vala 编程语言高级特性-具有语法支持的方法
  • JavaEE初阶4.0
  • 医疗编程AI技能树与培训技能树报告(国内外一流大学医疗AI相关专业分析2025版,上)
  • 【IEEE出版 | 高录用、稳定检索】第七届信息与计算机前沿技术国际学术会议(ICFTIC 2025)
  • 我爱学算法之—— 模拟(上)
  • 白云做网站网店怎么注册开网店
  • 有了域名和主机怎么做网站erp软件是什么软件
  • 大数据毕业设计选题推荐-基于大数据的青光眼数据可视化分析系统-大数据-Spark-Hadoop-Bigdata
  • 数据可视化 | 热力图Heatmap绘制Python代码 相关性矩阵学术可视化
  • C#对称加密(AES)的简单代码
  • AR眼镜在安防领域人脸识别技术方案|阿法龙XR云平台
  • 【传奇开心果系列】基于Flet实现的第三次大的升级优化版语音播报成语接龙小游戏V3.0.1特色和实现原理深度解析
  • 【Qt】输入类控件2——SpinBox,DateEdit,TimeEdit,Dial,Slider
  • activemq延迟消息变成实时收到了?
  • 重庆市住房和城乡建设部网站中山人才招聘网官网
  • 如何构建有效的需求知识库?如何让你的AI用它来评审新需求?
  • HTML 和 Streamlit ,到底哪个好
  • 数据结构 之 【图的遍历与最小生成树】(广度优先遍历算法、深度优先遍历算法、Kruskal算法、Prim算法实现)
  • 胶州做网站的做网站设计有哪些网页
  • 开源 C# 快速开发(十)通讯--http客户端
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • Mask R-CNN工业落地实战:计算机视觉物体检测开山鼻祖的产线级代码剖析
  • 沈阳网站制作全网性做橡胶的网站
  • C++压缩解压:Zstandard (Zstd)压缩库
  • 在网站建设中 为了防止工期拖延荥阳网站制作
  • Filebeat写ElasticSearch故障排查思路(下)
  • 禅道数据还原
  • 货架 网站建设 牛商网网站设计目的与规划怎么写
  • 基于STM32设计的环境监测系统(华为云IOT)_300