void
build_hash_table_machine(ClusterConfiguration *c) { intleft= CLUSTER_HASH_TABLE_SIZE; int m = 0; int i = 0; unsignedint rnd[CLUSTER_MAX_MACHINES]; unsignedint mach[CLUSTER_MAX_MACHINES]; int total = CLUSTER_HASH_TABLE_SIZE;
for(i = 0; i < c->n_machines; i++){ int mine = total /(c->n_machines - i);
mach[i]= mine;
total -= mine; }
while(left){ do{
i = next_rand(&rnd[m])% CLUSTER_HASH_TABLE_SIZE; }while(c->hash_table[i]!= 255);
mach[m]--;
c->hash_table[i]= m; left--;
m =(m + 1)% c->n_machines; }
这段代码可以保证:1)由于每个节点对应的hash空间中的虚拟节点都是通过对节点的ip地址取随机数然后向hash空间的大小取模,这样删除或增加节点时,剩余节点获取虚拟节点的公式不受影响,所以可以保证hash算法的单调性。2)由于每次是循环顺序遍历Cluster中的每个节点得到该节点对应的虚拟节点,这样可以保证每个节点对应的hash空间中的虚拟节点分布比较均匀。 这段代码中让我有点迷惑的是next_rand函数,它实现了一个随机数算法,ts代码中注释是这样解释的:"Not very random, but it generates all the numbers within 1 period which is all we need."。有时间需要做个实验查看一下这个随机数产生的结果是怎样的,也期待大牛给予解释。 后续我会给出该算法的实验性能数据,以供参考。 以下给出一些一致性Hash的参考资料: