// NewBloomFilter 创建一个新的布隆过滤器 // n: 预计元素数量 // p: 期望的误判率,例如0.01表示1% funcNewBloomFilter(n uint, p float64) *BloomFilter { // 根据预期元素数量和误判率计算最佳位数组大小 m := calculateOptimalSize(n, p) // 根据位数组大小和预期元素数量计算最佳哈希函数数量 k := calculateOptimalHashCount(m, n) // 创建布隆过滤器实例 bf := &BloomFilter{ bitset: make([]bool, m), size: m, count: 0, } // 初始化哈希函数 bf.hashFuncs = make([]func([]byte)uint, k) // 定义多个哈希函数 bf.hashFuncs[0] = func(data []byte)uint { h := fnv.New64() h.Write(data) returnuint(h.Sum64() % uint64(m)) } bf.hashFuncs[1] = func(data []byte)uint { h := crc32.NewIEEE() h.Write(data) returnuint(h.Sum32() % uint32(m)) } bf.hashFuncs[2] = func(data []byte)uint { h := adler32.New() h.Write(data) returnuint(h.Sum32() % uint32(m)) } // 使用不同的种子生成更多哈希函数 for i := uint(3); i < k; i++ { seed := i bf.hashFuncs[i] = func(data []byte)uint { h := fnv.New64a() h.Write(append(data, byte(seed))) returnuint(h.Sum64() % uint64(m)) } } return bf }
// Add 添加元素到布隆过滤器 func(bf *BloomFilter) Add(data []byte) { for _, hashFunc := range bf.hashFuncs { position := hashFunc(data) bf.bitset[position] = true } bf.count++ }
// Contains 检查元素是否可能存在于布隆过滤器中 func(bf *BloomFilter) Contains(data []byte) bool { for _, hashFunc := range bf.hashFuncs { position := hashFunc(data) if !bf.bitset[position] { returnfalse } } returntrue }
// 计算最佳位数组大小 funccalculateOptimalSize(n uint, p float64)uint { // m = -n*ln(p)/(ln(2)^2) m := uint(math.Ceil(-float64(n) * math.Log(p) / math.Pow(math.Log(2), 2))) return m }
// 计算最佳哈希函数数量 funccalculateOptimalHashCount(m, n uint)uint { // k = (m/n) * ln(2) k := uint(math.Ceil(float64(m) / float64(n) * math.Log(2))) if k < 3 { k = 3// 至少使用3个哈希函数 } return k }
// EstimateErrorRate 估算当前误判率 func(bf *BloomFilter) EstimateErrorRate() float64 { // 误判率公式: (1 - e^(-k*n/m))^k k := float64(len(bf.hashFuncs)) m := float64(bf.size) n := float64(bf.count) return math.Pow(1.0 - math.Exp(-k*n/m), k) }