一致性哈希算法(consistent hashing)样例+測试。
一个简单的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)样例+測试。的更多相关文章
- 一致性哈希算法(consistent hashing)(转)
原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网 ...
- 一致性哈希算法(Consistent Hashing Algorithm)
一致性哈希算法(Consistent Hashing Algorithm) 浅谈一致性Hash原理及应用 在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如 ...
- 转 白话解析:一致性哈希算法 consistent hashing
摘要: 本文首先以一个经典的分布式缓存的应用场景为铺垫,在了解了这个应用场景之后,生动而又不失风趣地介绍了一致性哈希算法,同时也明确给出了一致性哈希算法的优点.存在的问题及其解决办法. 声明与致谢: ...
- (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...
- 白话解析:一致性哈希算法 consistent hashing【转】
学习一致性哈希算法原理的时候看到博主朱双印的一片文章,看完就懂,大佬! 白话解析:一致性哈希算法 consistent hashing
- _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决
笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...
- 一致性哈希算法(consistent hashing)PHP实现
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...
- 五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...
- 一致性哈希算法(consistent hashing)【转】
一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...
随机推荐
- 【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...
- stm32智能小车之路之小车启动
首先.安装完小车后最激动的还是想让他跑动,那么就開始吧.写个简单的程序測试下电机是否正常.打开keil软件新建一个project,详细简历keilproject不会的请百度.或者call ...
- PHP - 递归函数
/** * factorial($num) 计算阶乘 * @param string $num * @return string $total */ function factorial($num) ...
- 遭遇“HTTP 错误 500.19 无法访问请求的页面,因为该页的相关配置数据无效。”
windows 2008下IIS7 安装ASP.NET 遇到如下错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. ...
- isotope/masonry 使用jQuery.sortable
function goMasonry() { // if ($container.data('masonry') != undefined) { $container.isotope('destroy ...
- javascript笔记整理(数组对象)
1.属性 a.length--设置或返回数组元素的数目 var a=[1,2,3,45,5]; alert(a.length=6) 结果:6 alert(a[5]) 结果:undefined b.co ...
- const对象默认是static的,而不是extern的
const 和 static 变量,可以放在头文件中 const对象默认是static的,而不是extern的,所以即使放在头文件中声明和定义.多个cpp引用同一个头文件,互相也没有感知,所以不会导致 ...
- Cppcheck 1.54 C/C++静态代码分析工具
Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型. 官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...
- [置顶] Windows Phone后台音乐详解一
应用于: Windows Phone 8 | Windows PhoneOS 7.1 你可以为winphone编写在后台播放音乐的app.这表示即使当用户点击返回或开始按钮离开你的应用界面时,你的应用 ...
- 【C语言】超大数乘法运算
昨天做排列组合的时候遇到A(a,b)这个问题,需要计算A(20,20)超大,计算机32位的,最大数只能是2^32,这让我很悲伤! 于是乎就自己研究了如何进行超大数的计算! /************* ...