定义如下,bloom过滤器只是一个int数字。

    创建一个布隆过滤器时,只需要指定为每个key分配的位数即可,如结论2所示,只要该值(m/n)大于1.44即可,一般可以取10。

    1. func NewBloomFilter(bitsPerKey int) Filter {
    2. return bloomFilter(bitsPerKey)
    3. }

    返回的generator中可以添加新的key信息,调用generate函数时,将所有的key构建成一个位数组写在指定的位置。

    generator主要有两个函数:

    • Add
    • GenerateAdd函数中,只是简单地将key的哈希散列值存储在一个整型数组中
    1. func (g *bloomFilterGenerator) Add(key []byte) {
    2. // Use double-hashing to generate a sequence of hash values.
    3. // See analysis in [Kirsch,Mitzenmacher 2006].
    4. g.keyHashes = append(g.keyHashes, bloomHash(key))
    5. }

    位数组的大小为用户指定的每个key所分配的位数 乘以 key的个数。

    位数组的最末尾用来存储k的大小。

    1. func (f bloomFilter) Contains(filter, key []byte) bool {
    2. if nBytes < 1 {
    3. return false
    4. }
    5. nBits := uint32(nBytes * 8)
    6.  
    7. // Use the encoded k so that we can read filters generated by
    8. // bloom filters created using different parameters.
    9. k := filter[nBytes]
    10. if k > 30 {
    11. // Reserved for potentially new encodings for short bloom filters.
    12. // Consider it a match.
    13. }
    14.  
    15. kh := bloomHash(key)
    16. delta := (kh >> 17) | (kh << 15) // Rotate right 17 bits
    17. for j := uint8(0); j < k; j++ {
    18. bitpos := kh % nBits
    19. if (uint32(filter[bitpos/8]) & (1 << (bitpos % 8))) == 0 {
    20. return false
    21. }
    22. kh += delta
    23. }
    24. }