From 1c8c14cb32884c1a0885e669509e2152f1d3e5e8 Mon Sep 17 00:00:00 2001 From: 554325746@qq.com <554325746@qq.com> Date: 星期一, 08 七月 2019 09:48:02 +0800 Subject: [PATCH] struct to map[string]float32] --- shardmap/shardmap.go | 79 +++++++++++++++++++++++++-------------- 1 files changed, 51 insertions(+), 28 deletions(-) diff --git a/shardmap/shardmap.go b/shardmap/shardmap.go index c19edd7..9f1dc6c 100644 --- a/shardmap/shardmap.go +++ b/shardmap/shardmap.go @@ -4,20 +4,18 @@ import ( "sync" + "encoding/json" "fmt" - - "basic.com/pubsub/protomsg.git" ) +var commonmux sync.Mutex const ( - DEF_SHARD_CNT = 32 BKDR_SEED = 131 // 31 131 1313 13131 131313 etc... ) type shardItem struct { sync.RWMutex - data map[string]interface{} } @@ -34,9 +32,6 @@ * @param uint8, shardCnt must be pow of two */ func New(shardCnt uint8) *ShardMap { - if !isPowOfTwo(shardCnt) { - shardCnt = DEF_SHARD_CNT - } s := &ShardMap{ shardCnt: shardCnt, @@ -83,33 +78,65 @@ } // modify by long. -func (s *ShardMap) Walk(wf wfOp, cfrom string) []*protomsg.Baseinfo{ +func (s *ShardMap) Walk(wf wfOp, cfrom string) ([]byte){ var wg sync.WaitGroup var second float32 + var buf []byte + var err error - var baseinfos []*protomsg.Baseinfo + ids := make(map[string]float32) + for _, si := range s.shards { + var tempsi shardItem + tempsi = *si + + + wg.Add(1) + + go func(st *shardItem, fw wfOp, cf string) { + defer wg.Done() + commonmux.Lock() + for id, feature := range st.data { + if str, ok := feature.(string); ok { + second = fw(cf,str) + if second == -1 { + continue + } + ids[id]=second + } + } + commonmux.Unlock() + }(&tempsi, wf, cfrom) + } + + wg.Wait() + + buf, err = json.Marshal(ids) + if err != nil { + fmt.Println("compare json err") + buf = nil + + } + return buf +} + +// print all +func (s *ShardMap) Printall() (infos []interface{}){ + var wg sync.WaitGroup for _, si := range s.shards { wg.Add(1) - go func(s *shardItem, fw wfOp, cf string) { + go func(s *shardItem) { defer wg.Done() s.RLock() - for key, value := range s.data { - second = fw(cf,key) - if second == -1 { - continue - } - if info, ok := value.(*protomsg.Baseinfo) ;ok { - fmt.Println("姣斿鍒嗘暟: ", second) - info.CompareScore = second - baseinfos = append(baseinfos,info) - } - } - s.RUnlock() - }(si,wf, cfrom) + for _, value := range s.data { + infos = append(infos, value) + } + + s.RUnlock() + }(si) } wg.Wait() - return baseinfos + return } func (s * ShardMap)GetLen() int { @@ -124,10 +151,6 @@ i := bkdrHash(key) & uint32(s.shardCnt-1) return s.shards[i] -} - -func isPowOfTwo(x uint8) bool { - return x != 0 && (x&(x-1) == 0) } //https://www.byvoid.com/blog/string-hash-compare/ -- Gitblit v1.8.0