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