diff --git a/util/bloom/Bloom.go b/util/bloom/Bloom.go index 573f6f4..53403ba 100644 --- a/util/bloom/Bloom.go +++ b/util/bloom/Bloom.go @@ -1,10 +1,14 @@ package bloom import ( + "encoding/binary" + "io" "math" + "unsafe" "github.com/spaolacci/murmur3" + "github.com/tursom/GoCollections/exceptions" "github.com/tursom/GoCollections/lang" ) @@ -85,3 +89,29 @@ func (b *Bloom) Add(data []byte) { b.m.SetBit(hashCode%b.m.BitLength(), true) } } + +func (b *Bloom) Marshal(writer io.Writer) { + if err := binary.Write(writer, binary.BigEndian, uint32(b.k)); err != nil { + panic(exceptions.Package(err)) + } + if err := binary.Write(writer, binary.BigEndian, uint32(b.c)); err != nil { + panic(exceptions.Package(err)) + } + + if _, err := writer.Write(b.m.Bytes()); err != nil { + panic(exceptions.Package(err)) + } +} + +func Unmarshal(data []byte) *Bloom { + k := binary.BigEndian.Uint32(data) + c := binary.BigEndian.Uint32(data[4:]) + + m := data[8:] + + return &Bloom{ + m: *(*lang.UInt8Array)(unsafe.Pointer(&m)), + k: uint(k), + c: uint(c), + } +}