java代码如何实现一个布隆过滤器算法呢?
下文笔者讲述java代码实现布隆过滤器的方法及示例分享,如下所示
布隆过滤器的简介
布隆过滤器算法: 一种快速判断一个元素是否属于一个集合的算法 布隆过滤器的原理: 通过多个哈希函数将元素映射为多个不同的位 然后将这些位设置为1 判断元素是否在集合中时 只需要将元素进行相同的哈希操作 后续通过判断得到的位是否都为1即可 ================================================ 布隆过滤器算法的实现思路: 1.定义一个合适的布隆过滤器大小和哈希函数个数 2.定义一个位图数组用于存储元素。 3.实现多个不同的哈希函数,将元素映射为不同的位。 4.实现添加元素和判断元素是否在集合中的方法。例
import java.util.BitSet; import java.util.Random; public class BloomFilter { private static final int DEFAULT_SIZE = 2 << 24; // 布隆过滤器数组大小,默认为2的24次方 private static final int[] SEEDS = new int[]{3, 5, 7, 11, 13, 31, 37, 61, 89}; // 哈希函数种子数 private BitSet bitSet = new BitSet(DEFAULT_SIZE); private Random random = new Random(); // 哈希函数1 private int hash1(String str) { int result = 0; for (int i = 0, len = str.length(); i < len; i++) { result = SEEDS[0] * result + str.charAt(i); } return (DEFAULT_SIZE - 1) & result; } // 哈希函数2 private int hash2(String str) { int result = 0; for (int i = 0, len = str.length(); i < len; i++) { result = SEEDS[1] * result + str.charAt(i); } return (DEFAULT_SIZE - 1) & result; } // 哈希函数3 private int hash3(String str) { int result = 0; for (int i = 0, len = str.length(); i < len; i++) { result = SEEDS[2] * result + str.charAt(i); } return (DEFAULT_SIZE - 1) & result; } // 添加元素 public void add(String str) { bitSet.set(hash1(str), true); bitSet.set(hash2(str), true); bitSet.set(hash3(str), true); } // 判断元素是否存在 public boolean contains(String str) { boolean ret = bitSet.get(hash1(str)) && bitSet.get(hash2(str)) && bitSet.get(hash3(str)); if (!ret) { return false; } return true; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。