Consistent::HashRing,一致性哈希。

一致性哈希的实现理解  1 namespace
  2 {
  3
  4     class StringifyException
  5     {
  6     };
  7
  8     template <class T>
  9     std::string Stringify(const T& t)
 10     {
 11         std::ostringstream os;
 12         if (!(os << t))
 13         {
 14             throw StringifyException();
 15         }
 16         return os.str();
 17     }
 18
 19     template <>
 20     std::string Stringify(const std::string& str)
 21     {
 22         return str;
 23     }
 24
 25     template <>
 26     std::string Stringify(const char* const& str)
 27     {
 28         return str;
 29     }
 30 }
 31
 32 namespace Consistent
 33 {
 34
 35     class EmptyRingException
 36     {
 37     };
 38
 39     template <class Node, class Data, class Hash = HASH_NAMESPACE::hash<const char*> >
 40     class HashRing
 41     {
 42     public:
 43         typedef std::map<size_t, Node> NodeMap;
 44
 45         HashRing(unsigned int replicas)
 46             : replicas_(replicas), hash_(HASH_NAMESPACE::hash<const char*>())
 47         {
 48         }
 49
 50         HashRing(unsigned int replicas, const Hash& hash)
 51             : replicas_(replicas), hash_(hash)
 52         {
 53         }
 54
 55         size_t AddNode(const Node& node);
 56         void RemoveNode(const Node& node);
 57         const Node& GetNode(const Data& data) const;
 58
 59     private:
 60         NodeMap ring_;
 61         const unsigned int replicas_;
 62         Hash hash_;
 63     };
 64
 65     template <class Node, class Data, class Hash>
 66     size_t HashRing<Node, Data, Hash>::AddNode(const Node& node)
 67     {
 68         size_t hash;
 69         std::string nodestr = Stringify(node);
 70         for (unsigned int r = 0; r < replicas_; r++)
 71         {
 72             hash = hash_((nodestr + Stringify(r)).c_str());
 73             ring_[hash] = node;
 74         }
 75         return hash;
 76     }
 77
 78     template <class Node, class Data, class Hash>
 79     void HashRing<Node, Data, Hash>::RemoveNode(const Node& node)
 80     {
 81         std::string nodestr = Stringify(node);
 82         for (unsigned int r = 0; r < replicas_; r++)
 83         {
 84             size_t hash = hash_((nodestr + Stringify(r)).c_str());
 85             ring_.erase(hash);
 86         }
 87     }
 88
 89     template <class Node, class Data, class Hash>
 90     const Node& HashRing<Node, Data, Hash>::GetNode(const Data& data) const
 91     {
 92         if (ring_.empty())
 93             throw EmptyRingException();
 94
 95         size_t hash = hash_(Stringify(data).c_str());
 96         typename NodeMap::const_iterator it;
 97         // Look for the first node >= hash
 98         it = ring_.lower_bound(hash);
 99         if (it == ring_.end())
100         {
101             // Wrapped around; get the first node
102             it = ring_.begin();
103         }
104         return it->second;
105     }
106 }
时间: 2024-10-15 23:54:29

Consistent::HashRing,一致性哈希。的相关文章

hash环/consistent hashing一致性哈希算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满

consistent hash(一致性哈希算法)

一.产生背景 今天咱不去长篇大论特别详细地讲解consistent hash,我争取用最轻松的方式告诉你consistent hash算法是什么,如果需要深入,Google一下~. 举个栗子吧: 比如有 N 个 cache 服务器,需要将一个object 映射到 N 个 cache 上,我们可以用类似下面的方法计算 object 的 hash 值,然后均匀的映射到到 N 个 cache 上: hash(object)%N 比如object是“hello”,hash(object)是100,N为3

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

原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing) 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的

Go语言实现一致性哈希(Consistent Hashing)算法

一致性哈希可用于解决服务器均衡问题. 用Golang简单实现了下,并加入了权重.可采用合适的权重配合算法使用. package main //一致性哈希(Consistent Hashing) //author: Xiong Chuan Liang //date: 2015-2-20 import ( "fmt" "hash/crc32" "sort" "strconv" "sync" ) const DE

一致性哈希算法(consistent hashing)

memcache的一致性hash算法使用 http://blog.csdn.net/kongqz/article/details/6695417 一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储.一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置.  2.常规hash

_00013 一致性哈希算法 Consistent Hashing 探讨以及相应的新问题出现解决

一.业务场景 假如我们现在有12台Redis服务器(其它的什么东西也行),有很多User(用户)的数据数据从前端过来,然后往12台redis服务器上存储,在存储中就会出现一个问题,12台服务器,有可能其中几台Redis服务器上(简称集群A)存了很多的数据,然后另外几台Redis服务器(简称集群B)上存的数据很少,这样的话那 A 上的读写压力就会很大(当然,这个要看你的数据量的大小了,如果你数据量很小的话,基本无压力了,但是数据量很大,那就 ...),对于这样的问题,我们通常的解决办法是什么呢 ?

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

笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术 转载声明:能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作. qq交流群:214293307  idkey=bf80524ac3630cb09

一致性哈希(Consistent Hashing)

一:HashMap 谈论Consistent Hashing前,先回顾一下HashMap. 当使用HashMap时,key会被均匀的映射到hashMap内部数组中(Entry[]),映射方法利用key的hash值做移位运算,和entry数组的长度(Length-1)做与运算(和hashtable不同,(key.hashcode() & 0x7FFFFFFF) % table.length,使数据分散均匀分布). put操作时,当底层数组数据量超过LoadFactor(默认0.75)* len时,

一致性哈希算法(consistent hashing)例子+测试。

我们知道着两个函数都提供每次输入一行的功能.然而gets是一个不推荐使用的函数,其原因是使用gets不能指定缓冲区的长度,这样就可能造成缓冲区的溢出.除了gets只能操作标准输入(stdin)外,gets和fgets还有另一个区别--gets并不将换行符读入缓冲区中.例如:输入"abcde\n",那么gets时缓冲区中只用"abcde"而没有"\n".相反fgets则会完整的读入"abcde\n". 与此对应,puts因为一般