Bloom filters
Bloom过滤器是集合的简明/压缩表示,其中主要要求是进行成员资格查询;i、 例如,项目是否为集合的成员。当元素确实存在时,布卢姆过滤器将始终正确报告集合中元素的存在。Bloom过滤器可以使用比原始集少得多的存储空间,但它允许一些“误报”:有时它可能报告某个元素在该集中,而它不在该集中。
当你构建时,你需要知道你有多少元素(期望的容量),以及你愿意容忍的期望假阳性率是多少。常见的假阳性率为1%。假阳性率越低,需要的内存就越多。同样,容量越大,使用的内存就越多。您可以按以下方式构造能够接收100万个元素、误报率为1%的Bloom过滤器。
filter := bloom.NewWithEstimates(1000000, 0.01)
您应该保守地调用“NewWithEstimates
”:如果您指定了许多元素,那么它就是
如果太小,可能会超过假阳性界限。Bloom过滤器不是动态数据结构:
你必须提前知道你想要的能力是什么。
我们的实现接受用于设置和测试的键作为“[]字节”。因此
添加字符串项Love
:
filter.Add([]byte("Love"))
同样的, 我们测试 "Love"
在Bloom过滤器中:
if filter.Test([]byte("Love"))
对于数值数据,我们建议您查看编码/二进制库。但是,例如,在过滤器中添加uint32
:
i := uint32(100)
n1 := make([]byte, 4)
binary.BigEndian.PutUint32(n1, i)
filter.Add(n1)
安装
go get -u github.com/bits-and-blooms/bloom/v3
贡献
如果您想为该项目做出贡献,请分支并向Master发出拉动请求 (“GitHub Flow”)
该项目包括一个允许您使用简单命令测试和构建项目的Makefile。
查看所有可用选项:
make help
运行测试
在进行代码之前,请检查是否使用所有测试(注意:这将安装一些依赖项):
make deps
make qa
构思设计
Bloom过滤器具有两个参数:M,存储中使用的位数和K,在集合元素上的哈希功能数量。(实际的哈希功能也很重要,但这不是此实现的参数)。Bloom过滤器由BITSet支持;通过在哈希函数的每个值(Modulo M)处设置位,在滤波器中表示一个键。设置成员资格是通过测试是否设置了哈希函数的每个值(再次,modulo m)来完成的。如果是这样,则该项目在集合中。如果该项目实际上在集合中,则Bloom过滤器将永远不会失败(真正的正率为1.0);但是它容易受到误报的影响。艺术是正确选择k和m。
在此实现中,使用的哈希功能是Murmurhash,这是一种非晶状体哈希功能。
鉴于特定的散列计划,最好对此进行经验。笔记
估计FP速率将清除BLOOM过滤器。