package com.yttd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHash<T> {
/** Hash计算对象,用于自定义hash算法 */
HashFunc hashFunc;
/** 复制的节点个数 */
private final int numberOfReplicas;
/** 一致性Hash环 */
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
/**
* 构造,使用Java默认的Hash算法
* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡
* @param nodes 节点对象
*/
public ConsistentHash(int numberOfReplicas, Collection<T> nodes) {
this.numberOfReplicas = numberOfReplicas;
this.hashFunc = new HashFunc() {
@Override
public Integer hash(Object key) {
String data = key.toString();
//默认使用FNV1hash算法
final int p = 16777619;
int hash = (int) 2166136261L;
for (int i = 0; i < data.length(); i++)
hash = (hash ^ data.charAt(i)) * p;
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
return hash;
}
};
//初始化节点
for (T node : nodes) {
add(node);
}
}
/**
* 构造
* @param hashFunc hash算法对象
* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡
* @param nodes 节点对象
*/
public ConsistentHash(HashFunc hashFunc, int numberOfReplicas, Collection<T> nodes) {
this.numberOfReplicas = numberOfReplicas;
this.hashFunc = hashFunc;
//初始化节点
for (T node : nodes) {
add(node);
}
}
/**
* 增加节点<br>
* 每增加一个节点,就会在闭环上增加给定复制节点数<br>
* 例如复制节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node
* 由于hash算法会调用node的toString方法,故按照toString去重
* @param node 节点对象
*/
public void add(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.put(hashFunc.hash(node.toString() + i), node);
}
}
/**
* 移除节点的同时移除相应的虚拟节点
* @param node 节点对象
*/
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.remove(hashFunc.hash(node.toString() + i));
}
}
/**
* 获得一个最近的顺时针节点
* @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点
* @return 节点对象
*/
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
int hash = hashFunc.hash(key);
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash); //返回此映射的部分视图,其键大于等于 hash
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
//正好命中
return circle.get(hash);
}
/**
* Hash算法对象,用于自定义hash算法
* @author xiaoleilu
*
*/
public interface HashFunc {
public Integer hash(Object key);
}
public static void main(String[] args){
ConsistentNode a = new ConsistentNode("192.168.14.237");
ConsistentNode b = new ConsistentNode("192.168.14.238");
List<ConsistentNode> listNodes = new ArrayList<ConsistentNode>();
listNodes.add(a);
listNodes.add(b);
ConsistentHash<ConsistentNode> consistentHash= new ConsistentHash<ConsistentNode>(40, listNodes);
for(Integer temp=1;temp<100;temp++){
ConsistentNode node=consistentHash.get(temp);
System.out.println(temp+":"+node.getIp());
}
}
}
package com.yttd;
public class ConsistentNode {
public String ip;
public ConsistentNode(String ip){
this.ip=ip;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
分享到:
相关推荐
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,旨在解决在分布式环境中数据分布不均匀的问题。Ketama算法是基于一致性哈希的一种优化实现,由Last.fm公司的Simon Willison提出,其目标是在...
一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)
### 一致性Hash算法的原理及实现 #### 一、引言 一致性Hash算法是一种用于解决分布式环境下数据存储和检索问题的重要技术。它最初由David Karger等人在1997年的论文《Consistent Hashing and Random Trees: ...
一致性hash算法简介加C++实现
- 插入、删除节点以及查找键对应节点的算法实现。 6. **应用场景**:一致性哈希在分布式缓存系统如Memcached和Redis中被广泛使用,同时在CDN(Content Delivery Network)、负载均衡器等场景也有应用。 7. **优缺点...
一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可扩展性。在C/C++编程中,一致性哈希通常用于构建分布式系统,如负载均衡、缓存...
一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT)的算法,它主要应用于分布式缓存、负载均衡等场景,旨在解决在动态扩展或收缩系统规模时,尽量减少数据迁移的问题。在这个简单的实现中,我们将探讨如何...
Ketama一致性哈希算法是基于一致性哈希的一种优化实现,主要解决了传统一致性哈希中节点分布不均匀的问题。在Ketama中,每个实际的物理服务器会被映射到多个虚拟节点,通常是100到200个,这些虚拟节点均匀分布在环上...
一致性哈希算法是一种在分布式系统中解决数据分片和负载均衡问题的算法,它主要解决了在动态添加或移除节点时,...总之,一致性哈希算法是分布式计算中的一个重要工具,通过巧妙的设计实现了高效的数据分布和动态扩展。
一致性hash算法简介
为了解决这个问题,可以采用跳数法(Jump Consistent Hash)或者更高级的一致性哈希变体,如Ketama或libketama。哈希冲突则可以通过开放寻址、链地址法等方法来解决。 此外,一致性哈希算法在分布式缓存如Memcached...
对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...
通过虚拟节点的设计,一致性哈希可以实现负载均衡。因为新加入的节点可以拥有更多的虚拟节点,因此能承担更多的数据,而老节点的负载则不会受到太大影响。 在实际应用中,一致性哈希算法不仅用于分布式缓存系统,...
总的来说,一致性哈希通过巧妙的设计,实现了在节点动态变化时尽可能保持键值映射稳定的目标,从而提高了分布式系统的可用性和效率。其核心在于虚拟节点的引入和环形哈希空间的构建,这两点使得一致性哈希在应对缓存...
主要介绍了PHP实现的一致性Hash算法,结合实例形式详细分析了php一致性Hash算法的概念、原理及相关实现与使用技巧,需要的朋友可以参考下
总结来说,一致性哈希算法是解决分布式环境中数据分布问题的关键技术,C++实现的一致性哈希库简化了开发人员在项目中应用该算法的过程。通过理解其原理和库的使用方法,我们可以构建更稳定、高效的分布式系统。