From 388f13d263c59a7157cc7d99e77c563b0d40287d Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Fri, 8 Mar 2024 18:52:19 -0600 Subject: [PATCH] brain/kvbrain: hash tag in keys --- brain/kvbrain/kvbrain.go | 11 ++++++++--- brain/kvbrain/learn.go | 5 +++-- brain/kvbrain/learn_test.go | 5 +++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/brain/kvbrain/kvbrain.go b/brain/kvbrain/kvbrain.go index 436fe37..751a7ed 100644 --- a/brain/kvbrain/kvbrain.go +++ b/brain/kvbrain/kvbrain.go @@ -2,6 +2,8 @@ package kvbrain import ( "context" + "hash/fnv" + "io" "time" "github.com/dgraph-io/badger/v4" @@ -48,9 +50,6 @@ func New(knowledge *badger.DB) *Brain { } } -// tagBytes is the number of bytes used to record tags in the KV database. -const tagBytes = 8 // TODO(zeph): we should just use a hash instead - // Order returns the number of elements in the prefix of a chain. It is // called once at the beginning of learning. The returned value must always // be at least 1. @@ -83,3 +82,9 @@ func (br *Brain) ForgetDuring(ctx context.Context, tag string, since, before tim func (br *Brain) ForgetUserSince(ctx context.Context, user *userhash.Hash, since time.Time) error { panic("not implemented") // TODO: Implement } + +func hashTag(tag string) uint64 { + h := fnv.New64a() + io.WriteString(h, tag) + return h.Sum64() +} diff --git a/brain/kvbrain/learn.go b/brain/kvbrain/learn.go index ed37131..d754001 100644 --- a/brain/kvbrain/learn.go +++ b/brain/kvbrain/learn.go @@ -3,6 +3,7 @@ package kvbrain import ( "bytes" "context" + "encoding/binary" "errors" "fmt" "slices" @@ -33,8 +34,8 @@ func (br *Brain) Learn(ctx context.Context, meta *brain.MessageMeta, tuples []br for i, t := range tuples { b.Reset() // Write the tag. - u := make([]byte, tagBytes) - copy(u, meta.Tag) + u := make([]byte, 8) + binary.LittleEndian.PutUint64(u, hashTag(meta.Tag)) b.Write(u) // Write prefixes. k := slices.IndexFunc(t.Prefix, func(s string) bool { return s != "" }) diff --git a/brain/kvbrain/learn_test.go b/brain/kvbrain/learn_test.go index f416878..ff2ce62 100644 --- a/brain/kvbrain/learn_test.go +++ b/brain/kvbrain/learn_test.go @@ -2,6 +2,7 @@ package kvbrain import ( "context" + "encoding/binary" "testing" "time" @@ -14,8 +15,8 @@ import ( func TestLearn(t *testing.T) { mkey := func(tag, toks string, id uuid.UUID) string { - b := make([]byte, tagBytes, tagBytes+len(toks)+len(id)) - copy(b, tag) + b := make([]byte, 8, 8+len(toks)+len(id)) + binary.LittleEndian.PutUint64(b, hashTag(tag)) b = append(b, toks...) b = append(b, id[:]...) return string(b)