golang,go,博客,开源,编程
github.com/bits-and-blooms/bloom
是 Go 语言中的 布隆过滤器(Bloom Filter) 实现。布隆过滤器是一种 高效的概率型数据结构,用于快速判断某个元素是否存在于一个集合中,具有 节省空间 和 高效查询 的特点,广泛应用于 去重、缓存、黑名单检测等场景。
使用 go get
下载安装:
go get github.com/bits-and-blooms/bloom
然后在代码中导入:
import "github.com/bits-and-blooms/bloom"
布隆过滤器使用 多个哈希函数 将元素映射到一个 位数组(bit array) 中:
1
。1
,如果存在 0
,则该元素一定 不在集合中,否则可能 在集合中(但可能存在误判)。package main
import (
"fmt"
"github.com/bits-and-blooms/bloom/v3"
)
func main() {
// 创建一个布隆过滤器,使用 1000 个 bit 位,3 个哈希函数
filter := bloom.New(1000, 3)
// 添加数据
filter.Add([]byte("hello"))
filter.Add([]byte("world"))
// 查询数据
fmt.Println(filter.Test([]byte("hello"))) // true
fmt.Println(filter.Test([]byte("world"))) // true
fmt.Println(filter.Test([]byte("golang"))) // false(一定正确)
}
bloom.New(size, hashCount)
:创建一个布隆过滤器,size
是位数组大小,hashCount
是哈希函数个数。filter.Add(data)
:向布隆过滤器中添加数据。filter.Test(data)
:测试数据是否可能在过滤器中。// 从 byte 数组加载布隆过滤器状态
data := []byte{0, 1, 0, 1} // 示例数据
filter := bloom.NewWithBytes(1000, 3, data)
可以调整 哈希函数个数(k) 和 位数组大小(m) 来优化误判率:
n := uint(1000) // 预期存储的元素个数
p := 0.01 // 误判率
m := bloom.EstimateParameters(n, p) // 计算最佳位数组大小
fmt.Println(m) // 输出建议的位数组大小
库 | 线程安全 | 泛型支持 | 误判率调整 | 备注 |
---|---|---|---|---|
bits-and-blooms/bloom | ❌ | ❌ | ✅ | 高性能但不支持并发 |
willf/bloom | ✅ | ❌ | ✅ | 线程安全,适用于并发环境 |
github.com/bits-and-blooms/bloom
是 Go 语言中 轻量级、高性能 的布隆过滤器实现。willf/bloom
。