/
consistentplus.go
81 lines (69 loc) · 1.48 KB
/
consistentplus.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package consistentplus
import (
"crypto/md5"
"sort"
)
type Member struct {
Name string
}
type Ring struct {
pointsPerMember int
members []*Member
ringRanges []ringRange
}
type ringRange struct {
point float32
member *Member
}
// create a new ring
func NewRing(pointsPerMember int) Ring {
return Ring{
pointsPerMember,
make([]*Member, 0),
make([]ringRange, 0) ,
}
}
func (r *Ring) AddMember(m *Member) {
r.members = append(r.members, m)
r.calculateRanges()
}
// func (r *Ring) FindMember(m *Member) *Member {
// return r.members[0]
// }
func (r *Ring) calculateRanges() {
size := len(r.members) * r.pointsPerMember
member_by_point := make(map[float64]*Member, size)
points := make([]int, size)
i := 0
for m := range r.members {
points = calculatePoints(m, r.pointsPerMember)
for p := range points {
member_by_point[p] = m
points[i] = p
i++
}
}
sort.Sort(points)
r.ringRange = make([]ringRange, size)
j := 0
for j < size {
r.ringRange[j] = ringRange{}
j++
}
}
// return the points on the ring that the particular member
// should use
func calculatePoints(m *Member, pointsPerMember int) []float64 {
}
func hash(key string) float64 {
asBytes := md5.size([]byte(key))
value := (
float64(asBytes[7]) << 48 |
float32(asBytes[7]) << 48 |
float64(asBytes[7]) << 48 |
float64(asBytes[7]) << 48 |
float64(asBytes[7]) << 48 |
float64(asBytes[7]) << 48 |
float64(asBytes[7]) << 48 |
)
}