关于布隆过滤器的概念性的介绍,我就不多做解释了,可以详细查看一下文章最后的那篇参考资料。

我实现这个布隆过滤器是从三个公式开始的,如下图所示

只有先处理好这些布隆过滤器的参数以后,才方便创建一个布隆过滤器。三个计算公式对应的实现代码如下:

下面我们开始定义布隆过滤器的类型

ElemNum表示布隆过滤器要加入的元素数量

BloomSize表示布隆过滤器使用的bitmap大小,单位是bit

HashFuncNum表示使用的哈希函数数量

ErrRate表示最大的容错率

bitMap用来指向存储bitmap数据的内存

keys用来存储哈希函数用到的随机数。

这里要详细说明一下,因为根据布隆过滤器的定义,把一个元素加入bitmap的过程中会用到多个哈希函数计算对应的多个哈希值,如果数量足够多,我也不可能编写多种哈希函数去处理(如md5,sha1,sha256等),所以我就采用取巧的方法,使用类似哈希加盐的方式来实现多种哈希函数。通过不同的盐,对同一个输入数据,同一个哈希函数,产生多个不同的哈希值。哈希函数实现如下:

接着增加布隆过滤器的三个方法:

分别表示初始化布隆过滤器,把元素加入布隆过滤器中,以及判断一个元素是否在布隆过滤器中。

最后增加布隆过滤器的New函数

一个简单的布隆过滤器就做好了,下面写几个测试用例测试一下:

完整代码可从github获得:https://github.com/lilianwen/bloomfilter

更多测试用例,后续可能会新增,如从大文件读取巨量测试数据进行测试。

参考资料:

https://mp.weixin.qq.com/s?__biz=Mzg3OTA1MTYzOQ==&mid=2247483700&idx=1&sn=44a9dac2c415b222fb9db5a09e4329a9&chksm=cf0b172cf87c9e3a9213325f5879f794754d601ce4bd7dff71b97da14379b0abafb42978bc9b&scene=27#wechat_redirect