func (c *CountingBloomFilter) Test(data []byte) bool {
	lower, upper := hashKernel(data, c.hash)
	for i := uint(0); i < c.k; i++ {
		if c.buckets.Get((uint(lower)+uint(upper)*i)%c.m) == 0 {
			return false
		}
	}
	return true
}
Test will test for membership of the data and returns true if it is a
member, false if not. This is a probabilistic test, meaning there is a
non-zero probability of false positives and false negatives.
package boom
import (
	"hash"
	"hash/fnv"
)
type CountingBloomFilter struct {
	buckets     *Buckets     
	hash        hash.Hash64  
	m           uint         
	k           uint         
	count       uint         
	indexBuffer []uint       
}
func NewCountingBloomFilter(n uint, b uint8, fpRate float64) *CountingBloomFilter {
	var (
		m = OptimalM(n, fpRate)
		k = OptimalK(fpRate)
	)
	return &CountingBloomFilter{
		buckets:     NewBuckets(m, b),
		hash:        fnv.New64(),
		m:           m,
		k:           k,
		indexBuffer: make([]uint, k),
	}
}
func NewDefaultCountingBloomFilter(n uint, fpRate float64) *CountingBloomFilter {
	return NewCountingBloomFilter(n, 4, fpRate)
}
func (c *CountingBloomFilter) Capacity() uint {
	return c.m
}
func (c *CountingBloomFilter) K() uint {
	return c.k
}
func (c *CountingBloomFilter) Count() uint {
	return c.count
}