一致性hash算法

看资料,了解到一致性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
}

圆形,真是神奇。
想想有没有其他什么地方能用到圆形?
环形缓冲区。
想到了再加。