java实现一致性hash算法实例
一致性hash算法java版本简单实现
com...;
java.util.;
java.util.List;
java.util.;
java.util.;
org.slf4j.;
org.slf4j.;
/**
* 一致性hash算法java简易实现
* @ IT云清
* 参考:
*/
class {
final = .(.class);
/**
* 虚拟节点个数
* 每个真实节点对应的虚拟节点个数
*/
final int = 5;
/**
* 虚拟节点
* eg:
* 真实节点数量一般偏少一致性hash算法 java,引入虚拟节点来平衡
* 每个真实节点对应多个虚拟节点,这样每个节点尽可能在hash环上均匀分布,可以根据虚拟节点找到真实节点
*/
= new ();
/**
* 真实节点
*/
List = new ();
/**
* 模拟初始节点
*/
[] = {"116.116.1.1", "116.116.1.2", "116.116.1.3", "116.116.1.5", "116.116.1.6"};
/**
* 初始化虚拟节点
*/
{
for ( : ) {
.add();
("添加真实节点{}",);
for(int i = 0;i < ; i ++){
= + "&&VN" + i;
int hash = ();
.put(hash,);
("添加虚拟节点{},hash为{}",,hash);
}
}
}
void main([]args){
test2();
}
void test2(){
//测试定位node
(("aa"));
(("涨三"));
((""));
((""));
("------------------");
//测试添加节点
("192.192.116.1");
("192.192.116.2");
("------------------");
//测试删除节点
("116.116.1.1");
}
/**
* 获取真实节点ip
* @param str 字符串
* @
*/
( str){
//计算hash
int hash = (str);
key = null;
//寻找最近的虚拟node
= .(hash);
//获取在hash环上 右侧最近的虚拟节点的key
key = .() ? .() : .();
//根据hash获取虚拟节点
= .get(key);
//返回虚拟节点的真实ip
.(0,.("&&"));
}
/**
* 添加节点
* @param node
*/
void ( node){
if(!.(node)){
.add(node);
("新增真实节点上线,{}",node);
for(int i = 0;i < ;i ++){
= node + "&&VN" + i;
int hash = ();
.put(hash,);
("新增虚拟节点{}一致性hash算法 java java实现一致性hash算法实例代码,hash为{}",,hash);
}
}
}
/**
* 删除节点
* @param node
*/
void ( node){
if(.(node)){
//下线真实节点
.(node);
("真实节点下线,{}",node);
for(int i = 0;i < ; i++){
= node + "&&VN" + i;
int hash = ();
//移除虚拟节点
.(hash);
("下线虚拟节点{}一致性hash算法 java,hash为{}",,hash);
}
}
}
/**
* 算法
* @param str 任意字符串
* @ 返回int类型的hash值
*/
int ( str) {
final int p = ;
int hash = (int) ;
for (int i = 0; i < str.(); i++) {
hash = (hash ^ str.(i)) * p;
}
hash += hash > 7;
hash += hash > 17;
hash += hash