一致性hash算法
Tue ,Mar 20 ,2018看资料,了解到一致性hash算法。
简单的写了一个demo, 测试之后,再去看其他人的算法,理解得更快一些。这是一个好的模式。
func main() {
hash := make([]string, 8)
mask := (1 << 3) - 1
hash[2] = "server1"
hash[5] = "server2"
hash[7] = "server3"
i := 50
index := 0
for i < 58 {
i++
index = i & mask
for {
if hash[index] != "" {
fmt.Println("find server: ", hash[index])
break
}
index = (index + 1) & mask
}
}
}
github上搜到一个golang版本的代码
本质上是一样的。实现上有一些不同。使用数组 找机器+存机器 会浪费空间。
而这个版本将数组下标单独拿出来,一个是排好序的数组下标用来找机器,一个是map[uint32]string用来存机器。
type Consistent struct {
circle map[uint32]string // 存机器。
members map[string]bool
sortedHashes uints // 找机器
NumberOfReplicas int // 节点复制个数,使得节点分布更均匀。
count int64
scratch [64]byte // buf
sync.RWMutex
}
圆形,真是神奇。
想想有没有其他什么地方能用到圆形?
环形缓冲区。
想到了再加。