11package cuckoo
22
33import (
4- "bytes"
54 "encoding/binary"
65 "fmt"
76
@@ -129,15 +128,13 @@ const bytesPerBucket = bucketSize * fingerprintSizeBits / 8
129128
130129// Encode returns a byte slice representing a Cuckoofilter.
131130func (cf * Filter ) Encode () []byte {
132- res := new (bytes.Buffer )
133- res .Grow (len (cf .buckets ) * bytesPerBucket )
134-
131+ buf := make ([]byte , 0 , len (cf .buckets )* bytesPerBucket )
135132 for _ , b := range cf .buckets {
136133 for _ , fp := range b {
137- binary . Write ( res , binary .LittleEndian , fp )
134+ buf = binary .LittleEndian . AppendUint16 ( buf , uint16 ( fp ) )
138135 }
139136 }
140- return res . Bytes ()
137+ return buf
141138}
142139
143140// Decode returns a Cuckoofilter from a byte slice created using Encode.
@@ -152,13 +149,13 @@ func Decode(data []byte) (*Filter, error) {
152149 if getNextPow2 (uint64 (numBuckets )) != uint (numBuckets ) {
153150 return nil , fmt .Errorf ("numBuckets must to be a power of 2, got %d" , numBuckets )
154151 }
155- var count uint
156- buckets := make ([]bucket , numBuckets )
157- reader := bytes .NewReader (data )
158152
153+ var count , pos uint
154+ buckets := make ([]bucket , numBuckets )
159155 for i , b := range buckets {
160156 for j := range b {
161- binary .Read (reader , binary .LittleEndian , & buckets [i ][j ])
157+ buckets [i ][j ] = fingerprint (binary .LittleEndian .Uint16 (data [pos : pos + 2 ]))
158+ pos += 2
162159 if buckets [i ][j ] != nullFp {
163160 count ++
164161 }
0 commit comments