package cn.ceopen.shard.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
/**
* 一致性hash实现
* @author 徐良永
*
* 2015年1月22日 下午2:34:05
*/
public class ConsistantHash2 {
//圆环 用treemap的主要原因是可以排序
private TreeMap<Long, Node> circle = new TreeMap<Long, Node>();
//真实结点
private List<Node> realNodes = new ArrayList<Node>();
public static void main(String[] args) {
ConsistantHash2 h = new ConsistantHash2();
h.addNode(new Node(1));
h.addNode(new Node(2));
// h.addNode(new ConsistentHash.Node(3));
// h.addNode(new ConsistentHash.Node(4));
// h.addNode(new ConsistentHash.Node(5));
// h.addNode(new ConsistentHash.Node(6));
// h.addNode(new ConsistentHash.Node(7));
// h.addNode(new ConsistentHash.Node(8));
// h.addNode(new ConsistentHash.Node(9));
for (int i = 0; i < 50; i++) {
h.getNode("" + i);
//System.out.println(i + "--->" + h.getNode("" + i));
}
}
public void addNode(Node node){
realNodes.add(node);
Long nodeKey = md5(node.toString());
System.out.println(node.toString() + " md5:" + nodeKey);
circle.put(nodeKey, node);
}
public void removeNode(Node node){
realNodes.remove(node);
Long nodeKey = md5(node.toString());
circle.remove(nodeKey);
}
/**
*
* @param key
* @return
*/
public Node getNode(String key){
//treemap 转成 排序好的map
Long keyMd5 = md5(key);
SortedMap<Long, Node> sortedMap = circle.tailMap(keyMd5);
Long k = null;
//没命中则选择第一个
if(sortedMap.isEmpty()){
k = (circle.firstKey());
System.out.println("not hit");
}else{
k = (sortedMap.firstKey());
}
Node node = circle.get(k);
//正常情况下 md5(key) < md5(node)
System.out.println(key + "(" + keyMd5 +") --->" + node.toString() + "(" + md5(node.toString()) + ")");
return node;
}
private long md5(String key){
byte[] bKey = DigestUtils.md5(key.getBytes());
long res = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16) | ((long) (bKey[1] & 0xFF) << 8)| bKey[0] & 0xFF;
return res;
}
static class Node{
private int nodeNum;
public Node(int num){
this.nodeNum = num;
}
@Override
public String toString(){
return "真实结点:" + nodeNum ;
}
}
}
分享到:
相关推荐
Ketama一致性哈希算法是基于一致性哈希的一种优化实现,主要解决了传统一致性哈希中节点分布不均匀的问题。在Ketama中,每个实际的物理服务器会被映射到多个虚拟节点,通常是100到200个,这些虚拟节点均匀分布在环上...
在这个简单的实现中,我们将探讨如何用Java语言来模拟一致性哈希的工作原理。 1. **一致性哈希的基本概念** - **哈希环**:一致性哈希将所有可能的哈希值映射到一个闭合的圆环上,每个节点都按照哈希值分布在环上...
对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...
本案例将深入探讨一致性哈希算法的工作原理及其在Java中的实现。 一致性哈希的核心思想是减少节点添加或删除时导致的数据映射关系变化。传统的哈希算法将数据均匀分布到固定数量的槽位上,但当槽位数量改变(例如...
下面我们将深入探讨一致性哈希算法的原理、特点以及Java实现。 一致性哈希算法的核心思想是将数据和服务器都映射到一个固定大小的哈希环上,数据根据其哈希值被分配到最近的服务器节点。当新增或移除服务器时,只有...
一致性哈希是一种分布式系统中的负载均衡算法,它通过一致性哈希环来实现对数据的分布,以降低分布式存储系统中由于节点增加或减少导致的大量数据迁移问题,从而保证了系统的扩展性和高可用性。
HashMap和TreeMap是Java中两种常用的Map实现,它们各自具有不同的特性和使用场景。 HashMap是基于哈希表实现的,其核心思想是通过键对象的hashCode()方法来快速定位到对应的桶(bucket),从而提高查找效率。...
9. 并发控制:考虑到多线程或多进程环境,代码管理器需要处理并发问题,确保在多个操作同时进行时数据的一致性。Java提供了线程和锁机制来支持并发编程。 10. 测试:为了确保代码管理器的功能正确无误,需要编写...
为了确保一致性,推荐使用Apache Commons Lang库中的`HashCodeBuilder`类来生成高质量的`hashCode`值。 - **基于排序二叉树的实现**:`TreeMap`和`TreeSet`采用红黑树数据结构实现,这要求集合中的元素必须具备可...
1. **一致性**:同一对象多次调用 `hashCode()` 方法应返回相同的整数值,除非对象状态发生改变。 2. **相等性**:如果两个对象根据 `equals(Object obj)` 方法判断为相等,则它们的 `hashCode()` 必须相同。 3. **...
- **类型一致性**:数组存储的元素必须是同一数据类型;而集合可以存储不同类型的对象。 #### 4. 使用集合框架的好处 - **容量自增长**:集合能够自动调整容量,无需手动调整。 - **高效的数据结构和算法**:集合...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理各种数据存储和操作时更加高效。本资源聚焦于Java集合中的四个关键类:HashSet、TreeSet、HashMap和TreeMap,它们...
Java的`java.util.TreeSet`和`java.util.TreeMap`基于红黑树实现。 7. 图:图是由节点和边构成的数据结构,用于表示对象之间的关系。Java标准库并未提供直接的图实现,但可以通过自定义类或使用第三方库来实现。 8...
* HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。 * TreeSet:基于红黑树实现,支持有序性操作,但查找效率不如 HashSet。 * LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护...
`Vector`是早期Java集合框架的一部分,其方法内部已经实现了同步处理,因此在多线程环境中可以直接使用而不用担心数据一致性问题。`Stack`类实际上是从`Vector`继承而来,因此也具备线程安全特性。`Hashtable`则是在...
9. 并发集合:Java提供了如`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发安全的集合,可以在多线程环境下保证数据一致性。 10. `Optional`类:Java 8引入,用于表示可能为null的值,减少空指针异常的风险。 ...
在多线程环境下,它们能够确保数据的一致性和完整性。 接口详解: - Collection接口:作为所有集合类的基接口,定义了基本的添加、删除和遍历操作。Collection有两个主要子接口:List和Set。 - List接口:有序集合...
7. **并发处理**:Java集合框架也支持线程安全的实现,如ConcurrentHashMap和CopyOnWriteArrayList,这在多线程游戏环境中非常重要,可以保证数据的一致性和正确性。 8. **性能优化**:了解集合的内部原理和操作...
Java的设计目标是具有高度的可移植性、安全性、健壮性和性能,使其能够在各种平台和设备上运行,包括个人电脑、服务器、移动设备以及嵌入式系统。 1. **Java基础** - **语法结构**:Java语法与C++类似,但更简洁,...
它位于 `java.util` 包下,提供了一系列接口和实现类,使得开发者能够灵活地处理各种数据结构,如数组、链表、哈希表等。 **Collection 接口** Collection 是所有集合类的顶级接口,它定义了集合的基本操作。...