fast init
This commit is contained in:
parent
5d542568fd
commit
51975eae03
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.idea
|
||||||
|
*.exe
|
||||||
|
demo
|
||||||
|
etc/*.conf
|
||||||
|
etc/*.cfg
|
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module github.com/joykk/hashring
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
|
require github.com/sirupsen/logrus v1.4.2
|
13
go.sum
Normal file
13
go.sum
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
||||||
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
@ -88,8 +88,12 @@ func (h *HashRing) generate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
totalVirtualSpots := h.virualSpots * len(h.weights)
|
totalVirtualSpots := h.virualSpots * len(h.weights)
|
||||||
h.nodes = nodesArray{}
|
|
||||||
|
|
||||||
|
var nodeLen, nodeIndex int64
|
||||||
|
for _, w := range h.weights {
|
||||||
|
nodeLen += int64(math.Floor(float64(w) / float64(totalW) * float64(totalVirtualSpots)))
|
||||||
|
}
|
||||||
|
h.nodes = make(nodesArray, nodeLen)
|
||||||
for nodeKey, w := range h.weights {
|
for nodeKey, w := range h.weights {
|
||||||
spots := int(math.Floor(float64(w) / float64(totalW) * float64(totalVirtualSpots)))
|
spots := int(math.Floor(float64(w) / float64(totalW) * float64(totalVirtualSpots)))
|
||||||
for i := 1; i <= spots; i++ {
|
for i := 1; i <= spots; i++ {
|
||||||
@ -100,7 +104,8 @@ func (h *HashRing) generate() {
|
|||||||
nodeKey: nodeKey,
|
nodeKey: nodeKey,
|
||||||
spotValue: genValue(hashBytes[6:10]),
|
spotValue: genValue(hashBytes[6:10]),
|
||||||
}
|
}
|
||||||
h.nodes = append(h.nodes, n)
|
h.nodes[nodeIndex] = n
|
||||||
|
nodeIndex += 1
|
||||||
hash.Reset()
|
hash.Reset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
package hashring
|
package hashring
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -22,7 +26,6 @@ func getNodesCount(nodes nodesArray) (int, int, int) {
|
|||||||
}
|
}
|
||||||
if node.nodeKey == node2 {
|
if node.nodeKey == node2 {
|
||||||
node2Count += 1
|
node2Count += 1
|
||||||
|
|
||||||
}
|
}
|
||||||
if node.nodeKey == node3 {
|
if node.nodeKey == node3 {
|
||||||
node3Count += 1
|
node3Count += 1
|
||||||
@ -82,3 +85,32 @@ func TestHash(t *testing.T) {
|
|||||||
t.Logf("len of nodes is %v after AddNode node1:%v, node2:%v, node3:%v", len(hash.nodes), c1, c2, c3)
|
t.Logf("len of nodes is %v after AddNode node1:%v, node2:%v, node3:%v", len(hash.nodes), c1, c2, c3)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TimeTrack(start time.Time) {
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
|
||||||
|
// Skip this function, and fetch the PC and file for its parent.
|
||||||
|
pc, _, _, _ := runtime.Caller(1)
|
||||||
|
|
||||||
|
// Retrieve a function object this functions parent.
|
||||||
|
funcObj := runtime.FuncForPC(pc)
|
||||||
|
|
||||||
|
// Regex to extract just the function name (and not the module path).
|
||||||
|
runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`)
|
||||||
|
name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")
|
||||||
|
|
||||||
|
fmt.Printf("TimeTrack funcName:%s elapsed:%s \n", name, elapsed)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSpeed(t *testing.T) {
|
||||||
|
// node=1000 v=50000 on 16GB/win10/i7 init 35s
|
||||||
|
defer TimeTrack(time.Now())
|
||||||
|
nodeWeight := make(map[string]int)
|
||||||
|
for i := 0; i < 1000; i += 1 {
|
||||||
|
nodeWeight[strconv.Itoa(i)] = 1
|
||||||
|
}
|
||||||
|
vitualSpots := 50000
|
||||||
|
hash := NewHashRing(vitualSpots)
|
||||||
|
|
||||||
|
hash.AddNodes(nodeWeight)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user