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
|
import "hash/crc32"
type Hash func(data []byte) uint32
// 用crc32
var defaultHashFn = crc32.ChecksumIEEE
// 哈希环
// 注意,非线程安全,业务需要自行加锁
type HashRing struct {
hash Hash
// 每个真实节点的虚拟节点数量
replicas int
// 哈希环,按照节点哈希值排序
ring []int
// 用来在新增节点时去重的
keys []string
// 节点哈希值到真实节点字符串,哈希映射的逆过程
nodes map[int]string
}
func NewHashRing(r int,fn Hash)*HashRing(){
if fn==nil{
fn = defaultHashFn
}
return &HashRing{
replicas: r,
hash: fn,
ring: make([]int,0,8*r),
keys: make([]string,0,8),
nodes: make(map[int]string,8),
}
}
|