@@ -37,7 +37,7 @@ func NewFilter(numElements uint) *Filter {
3737 return & Filter {
3838 buckets : buckets ,
3939 count : 0 ,
40- bucketIndexMask : uint ( len ( buckets ) - 1 ) ,
40+ bucketIndexMask : numBuckets - 1 ,
4141 }
4242}
4343
@@ -73,7 +73,11 @@ func (cf *Filter) Insert(data []byte) bool {
7373 if cf .insert (fp , i2 ) {
7474 return true
7575 }
76- return cf .reinsert (fp , randi (& cf .rng , i1 , i2 ))
76+ if cf .rng .Uint64 ()& 1 == 0 {
77+ return cf .reinsert (fp , i1 )
78+ } else {
79+ return cf .reinsert (fp , i2 )
80+ }
7781}
7882
7983func (cf * Filter ) insert (fp fingerprint , i uint ) bool {
@@ -86,9 +90,9 @@ func (cf *Filter) insert(fp fingerprint, i uint) bool {
8690
8791func (cf * Filter ) reinsert (fp fingerprint , i uint ) bool {
8892 for k := 0 ; k < maxCuckooKickouts ; k ++ {
89- j := cf .rng .Intn ( bucketSize )
93+ j := cf .rng .Uint64 () & ( bucketSize - 1 )
9094 // Swap fingerprint with bucket entry.
91- cf. buckets [ i ][ j ], fp = fp , cf.buckets [i ][ j ]
95+ fp = cf .buckets [i ]. swap ( j , fp )
9296
9397 // Move kicked out fingerprint to alternate location.
9498 i = getAltIndex (fp , i , cf .bucketIndexMask )
@@ -130,9 +134,7 @@ const bytesPerBucket = bucketSize * fingerprintSizeBits / 8
130134func (cf * Filter ) Encode () []byte {
131135 buf := make ([]byte , 0 , len (cf .buckets )* bytesPerBucket )
132136 for _ , b := range cf .buckets {
133- for _ , fp := range b {
134- buf = binary .LittleEndian .AppendUint16 (buf , uint16 (fp ))
135- }
137+ buf = binary .LittleEndian .AppendUint64 (buf , uint64 (b ))
136138 }
137139 return buf
138140}
@@ -152,14 +154,10 @@ func Decode(data []byte) (*Filter, error) {
152154
153155 var count , pos uint
154156 buckets := make ([]bucket , numBuckets )
155- for i , b := range buckets {
156- for j := range b {
157- buckets [i ][j ] = fingerprint (binary .LittleEndian .Uint16 (data [pos : pos + 2 ]))
158- pos += 2
159- if buckets [i ][j ] != nullFp {
160- count ++
161- }
162- }
157+ for i := range buckets {
158+ buckets [i ] = bucket (binary .LittleEndian .Uint64 (data [pos : pos + 8 ]))
159+ pos += 8
160+ count += bucketSize - buckets [i ].nullsCount ()
163161 }
164162 return & Filter {
165163 buckets : buckets ,
0 commit comments