一致性哈希 java List实现

package cn.ceopen.shard.utils;

import java.util.ArrayList;
import java.util.List;

/**
* 一致性hash 用list简单实现
* @author 徐良永
*
* 2015年1月22日 上午11:13:35
*/
public class ConsistentHash {

/**
* 圆环的长度
*/
private static final int CIRCLE_LENGTH = 100;

//圆环
private List<Node> circle = new ArrayList<Node>(CIRCLE_LENGTH);

private List<Node> realNodes = new ArrayList<Node>();

/**
* 添加真实结点
* @param node
*/
public void addNode(Node node){
realNodes.add(node);
refreshCircle();
}

/**
* 删除真实结点
* @param node
*/
public void removeNode(Node node){
realNodes.remove(node);
refreshCircle();
}

/**
* 刷新圆环
*/
private void refreshCircle(){
int n = CIRCLE_LENGTH / realNodes.size(); //把circle分成 n 份, n是真实结点个数
int index = 0;
//给圆环的每个节点赋值
for (int i = 0; i < realNodes.size(); i++) {
for (int j = 0; j < n; j++) {
circle.add(index++, realNodes.get(i));
}
}

//余下的节点 用第一个真实结点赋值
for (int i = index; i < CIRCLE_LENGTH; i++) {
circle.add(i, realNodes.get(0));
}
}


public ConsistentHash(){
}



public Node getNode(int key){
return circle.get(key % CIRCLE_LENGTH);
}


public static void main(String[] args) {
ConsistentHash h = new ConsistentHash();
h.addNode(new Node(1));
h.addNode(new Node(2));
h.addNode(new Node(3));

for (int i = 0; i < 150; i++) {
System.out.println(i + "--->" + h.getNode(i).toString());
}
}

static class Node{
private int nodeNum;

public Node(int num){
this.nodeNum = num;
}

@Override
public String toString(){
return "真实结点:" + nodeNum ;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值