一个简单的consistent hashing的样例,非常easy理解。

首先有一个设备类,定义了机器名和ip:

public class Cache
{
public String name;
public String ipAddress;
}

然后是基本的实现:

public class Shard<T> {
//hash 算法并非保证绝对的平衡,假设 cache 较少的话,对象并不能被均匀的映射到 cache 上,
//所以添加虚拟节点
private TreeMap<Long, T> nodes;
private List<T> shards; //节点碎片
private final int NODE_NUM = 10; // 每一个机器节点关联的虚拟节点个数 public Shard(List<T> shards) {
this.shards = shards;
init();
} private void init() {
nodes = new TreeMap<Long, T>();
for (int i = 0; i < shards.size(); i++)
{ // 遍历真实节点
final T shardInfo = shards.get(i); for (int n = 0; n < NODE_NUM; n++)
{
// 真实节点关联虚拟节点,真实节点是VALUE;
nodes.put((long) Hash("SHARD-" + i + "-NODE-" + n), shardInfo);
}
System.out.println(shardInfo);
}
} public T getShardInfo(String key) {
SortedMap<Long, T> tail = nodes.tailMap((long) Hash(key));
if (tail.size() == 0) {
return nodes.get(nodes.firstKey());
}
//找到近期的虚拟节点
return tail.get(tail.firstKey());
} /**
* 改进的32位FNV算法,高离散
*
* @param string
* 字符串
* @return int值
*/
public static int Hash(String str)
{
final int p = 16777619;
int hash = (int) 2166136261L;
for (byte b : str.getBytes())
hash = (hash ^ b) * p;
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
return hash;
} }

到这里就完了,是不是非常easy,以下来測试下:

public class Test
{ /**
* @param args
*/
public static void main(String[] args)
{
List<Cache> myCaches=new ArrayList<Cache>();
Cache cache1=new Cache();
cache1.name="COMPUTER1";
Cache cache2=new Cache();
cache2.name="COMPUTER2";
myCaches.add(cache1);
myCaches.add(cache2); Shard<Cache> myShard=new Shard<Cache>(myCaches); Cache currentCache=myShard.getShardInfo("info1");
System.out.println(currentCache.name); // for(int i=0;i<20;i++)
// {
// String object=getRandomString(20);//产生20位长度的随机字符串
// Cache currentCache=myShard.getShardInfo(object);
// System.out.println(currentCache.name);
// } } public static String getRandomString(int length) { //length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
} }

我们有两台设备,computer1和computer2,第一次初始化要构建一个2的32次方的环,并往上面放设备。这个环由改进的FNV算法实现。位置也由hash算法确定。

但我们仅仅有两台设备,非常明显在环上会分布不均匀(这个就不解释了,网上非常多资料)。于是我们每台设备添加10个虚拟设备。

最后分布例如以下:

-1561290727=Hash.Cache@10f11b8,
-1083588870=Hash.Cache@10f11b8,
-697149481=Hash.Cache@10f11b8,
-253517545=Hash.Cache@10f11b8,
397383558=Hash.Cache@10f11b8,
1078505027=Hash.Cache@10f11b8,
1810977445=Hash.Cache@10f11b8,
1844081498=Hash.Cache@10f11b8,
2004894833=Hash.Cache@10f11b8,
2051863688=Hash.Cache@10f11b8

-2147483648到2147483647之间是不是比較均匀,这是java的,假设是c#的就是0~2的32次方。我们hash计算出KEY值为2049553054,然后顺时针找到近期的位置,即为

2051863688=Hash.Cache@10f11b8

结果我们定位到了COMPUTER1

最好我们要看看平衡性怎样:取消上面凝视的代码,循环20次,得到结果例如以下:

COMPUTER1

COMPUTER2

COMPUTER1

COMPUTER2

COMPUTER1

COMPUTER2

COMPUTER1

COMPUTER1

COMPUTER1

COMPUTER2

COMPUTER2

COMPUTER2

COMPUTER1

COMPUTER2

COMPUTER1

COMPUTER1

COMPUTER1

COMPUTER2

COMPUTER1

COMPUTER2

大家能够自己取试试,

FNV哈希算法是一种高离散性的哈希算法,特别适用于哈希很相似的字符串,比如:URL,IP,主机名,文件名称等。

下面服务使用了FNV:

1、calc

2、DNS

3、mdbm key/value查询函数

4、数据库索引hash

5、主流web查询/索引引擎

6、高性能email服务

7、基于消息ID查询函数

8、auti-spam反垃圾邮件过滤器

9、NFS实现(比方freebsd 4.3, linux NFS v4)

10、Cohesia MASS project

11、Ada 95的spellchecker

12、开源x86汇编器:flatassembler   user-defined symbol hashtree

13、PowerBASIC

14、PS2、XBOX上的文本资源

15、非加密图形文件指纹

16、FRET

17、Symbian DASM

18、VC++ 2005的hash_map实现

19、memcache中的libketama

20、 PHP 5.x

21、twitter中用于改进cache碎片

22、BSD IDE project

23、deliantra game server

24、 Leprechaun

25、IPv6流标签

一致性哈希算法(consistent hashing)样例+測试。的更多相关文章

  1. 一致性哈希算法(consistent hashing)(转)

    原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)  一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网 ...

  2. 一致性哈希算法(Consistent Hashing Algorithm)

    一致性哈希算法(Consistent Hashing Algorithm) 浅谈一致性Hash原理及应用   在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如 ...

  3. 转 白话解析:一致性哈希算法 consistent hashing

    摘要: 本文首先以一个经典的分布式缓存的应用场景为铺垫,在了解了这个应用场景之后,生动而又不失风趣地介绍了一致性哈希算法,同时也明确给出了一致性哈希算法的优点.存在的问题及其解决办法. 声明与致谢: ...

  4. (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...

  5. 白话解析:一致性哈希算法 consistent hashing【转】

    学习一致性哈希算法原理的时候看到博主朱双印的一片文章,看完就懂,大佬! 白话解析:一致性哈希算法 consistent hashing

  6. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

  7. 一致性哈希算法(consistent hashing)PHP实现

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

  8. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  9. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  10. 一致性哈希算法(consistent hashing)【转】

    一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...

随机推荐

  1. PHP - 递归函数

    /** * factorial($num) 计算阶乘 * @param string $num * @return string $total */ function factorial($num) ...

  2. python对web服务器做压力测试并做出图形直观显示

    压力测试有很多工具啊.apache的,还有jmeter, 还有loadrunner,都比较常用. 其实你自己用python写的,也足够用. 压力测试过程中要统计时间. 比如每秒的并发数,每秒的最大响应 ...

  3. Linux内核源代码解析之——sock's buffer参数

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/11539695 关于socket与sock的关系再简单 ...

  4. ASP.NET - 记住滚动条的位置

    MaintainScrollPositionOnPostback ="true" 如果是滚动条在最下面,那么如果刷新页面,滚动条回到最上面. 使用这个属性之后,滚动条会在刷新之前的 ...

  5. os内存使用管理之linux篇

    os内存使用管理之linux篇 看一下LINUX内存机制是怎么运作的,了解了基础知识,对于理解和操作是有很大帮助的. 抛砖引玉: Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会施 ...

  6. webstorm入门1-主题和配色

    1.引子 以前介绍过 Sublime text 3 系列的文章,着重介绍了 Sublime text 3 如何下载.安装.插件.配置等内容.Sublime text 3的轻量和富扩展,为前端开发带来了 ...

  7. WEB相关协议

    1.数据链路层 2.网络层 3.传输层 4.应用层 ,其中ip是在第二层网络层中,tcp是在第3层传输层中,Internet体系结构最重要的是tcp/ip协议,是实现互联网络连接性和互操作性的关键,它 ...

  8. 调用函数的ALV、面向对象的ALV设置带选择列

    这个就是通过对应的选择列,实现对ALV数据的选择,在调用函数的ALV和面向对象的ALV实现方法存在差异,下面讲两者的方法:1)调用函数的ALV.   通过 SLIS_LAYOUT_ALV-BOX_FI ...

  9. 【ASP.NET Web API教程】2.3.3 创建Admin控制器

    原文:[ASP.NET Web API教程]2.3.3 创建Admin控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 3 ...

  10. rac各节点实例需设置为相同的一些参数

    RAC Parameters That Require Identical Settings • ACTIVE_INSTANCE_COUNT • ARCHIVE_LAG_TARGET • COMPAT ...