一致性哈希 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 ;
		}
	}
}

你可能感兴趣的:(一致性哈希)