美文网首页
C++实现一个简单的一致性hash

C++实现一个简单的一致性hash

作者: 东京的雨不会淋湿首尔 | 来源:发表于2021-08-19 15:41 被阅读0次

    原理不解释了,网上都有。
    实现要点:

    • 保持虚拟节点和物理节点的映射关系
    • 数据 hash 之后落在hash 环顺时针遇到的第一个节点上面
    #include <bits/stdc++.h>
    
    using namespace  std;
    
    class ConsistentHash{
    private:
        unordered_set<string> physicalServer; // 真实的物理机器
        map<std::size_t , string> serverNodes; // hash 值和节点ip映射(真实ip)
        int virtualNodeNum;
        hash<string> hashStr; // 自带的 hash 函数
    public:
        ConsistentHash(int vnum):virtualNodeNum(vnum){};
        void addNode(const string& ip){
            physicalServer.insert(ip);
            // 加入物理节点的时候也加入虚拟节点
            for(int i=0;i<virtualNodeNum;++i){
                stringstream key;
                key<<ip<<"#"<<i;
                serverNodes.insert({hashStr(key.str()),ip});
            }
        }
        void delNode(const string &ip){
            physicalServer.erase(ip);
            for(int i=0;i<virtualNodeNum;++i){
                stringstream key;
                key<<ip<<"#"<<i;
                serverNodes.erase(hashStr(key.str()));
            }
        }
        // 模拟插入整数到 hash string
        string virtualInsert(int data){
            stringstream key;
            key<<data;
            size_t hashKey=hashStr(key.str());
            auto iter=serverNodes.lower_bound(hashKey);
            if(iter==serverNodes.end()){
                return serverNodes.begin()->second;
            }
            return iter->second;
        }
    };
    int main(){
        ConsistentHash hash(10);
        hash.addNode("127.0.0.1");
        hash.addNode("127.0.0.2");
        hash.addNode("127.0.0.3");
        map<string,int> stats;
        for(int i=0;i<1000;++i){
            stats[hash.virtualInsert(i)]++;
        }
        for(auto &s:stats){
            cout<< s.first <<" "<<setprecision(2)<< s.second/(1000*1.0)<<endl;
        }
        return 0;
    }
    

    结果如下:

    127.0.0.1 0.26
    127.0.0.2 0.31
    127.0.0.3 0.43
    

    结果看数据落盘还是比价均衡

    相关文章

      网友评论

          本文标题:C++实现一个简单的一致性hash

          本文链接:https://www.haomeiwen.com/subject/bucabltx.html