Help us shape the future of Go! Take the 2026 Go Developer Survey

bloomx

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 17, 2026 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package bloomx 提供进程内布隆过滤器。

用于本地去重与存在性预检:Test 返回 false 表示一定不存在, 返回 true 表示可能存在(误判率受 fpRate 控制)。适合缓存穿透防护、 重复事件过滤等场景;仅内存存活,不做持久化与跨进程共享。

用法

bf := bloomx.New(10000, 0.01) // 预计 1 万元素、1% 误判率
bf.Add("event-42")
bf.Test("event-42") // true(可能存在)
bf.Test("other")    // false(一定不存在)

设计说明

  • 非法入参(fpRate 不在 (0,1)、estElements<=0)归一为文档化默认值, 不返回 error——参数错了只是精度损失,不值得让调用方写错误分支
  • 哈希用 Kirsch-Mitzenmacher 双哈希(h1/h2 均基于 encoding.Fnv1a64, 消费前过 64 位 finalizer 补 FNV 低位雪崩),每元素只算两次 FNV 派生 k 个位置
  • 并发安全(sync.RWMutex):Add/Reset 走写锁,Test 走读锁

Index

Constants

View Source
const (
	// DefaultEstElements 是 estElements 非法(<=0)时归一采用的默认容量。
	DefaultEstElements = 1024
	// DefaultFPRate 是 fpRate 非法(不在 (0,1) 开区间)时归一采用的默认误判率。
	DefaultFPRate = 0.01
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Filter

type Filter struct {
	// contains filtered or unexported fields
}

Filter 是进程内布隆过滤器。 Test 返回 false 表示一定不存在;返回 true 表示可能存在(误判率 <= fpRate)。 必须经 New 创建,零值不可用。

func New

func New(estElements int, fpRate float64) *Filter

New 创建布隆过滤器。estElements 为预计元素数量,fpRate 为目标误判率 (如 0.01 表示 1%)。非法入参归一为文档化默认值:estElements<=0 取 DefaultEstElements,fpRate 不在 (0,1) 取 DefaultFPRate。

位数组长度 m = ceil(-n·ln p / (ln2)²),向上取 2 的幂(与奇数 h2 配合 保证每条哈希序列完整覆盖位数组,取模同时退化为位掩码),下限 64; 哈希函数个数 k = ceil(m/n·ln2),下限 1。

func (*Filter) Add

func (f *Filter) Add(s string)

Add 添加元素(字符串便捷形式)。

func (*Filter) AddBytes

func (f *Filter) AddBytes(b []byte)

AddBytes 添加元素。 布隆过滤器只做存在性预检,不返回"是否为新元素"。

func (*Filter) Bits

func (f *Filter) Bits() int

Bits 返回位数组长度(位)。

func (*Filter) HashFuncs

func (f *Filter) HashFuncs() int

HashFuncs 返回哈希函数个数 k。

func (*Filter) Reset

func (f *Filter) Reset()

Reset 清空全部位(保留 m/k 配置,可继续复用)。

func (*Filter) Test

func (f *Filter) Test(s string) bool

Test 报告元素是否可能存在(字符串便捷形式)。

func (*Filter) TestBytes

func (f *Filter) TestBytes(b []byte) bool

TestBytes 报告元素是否可能存在。 false 表示一定不存在;true 表示可能存在(误判率 <= fpRate)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL