美文网首页
用你熟悉的编程语言实现一致性 hash 算法

用你熟悉的编程语言实现一致性 hash 算法

作者: 花生无翼 | 来源:发表于2020-09-28 17:27 被阅读0次

    编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。

    package com.ssm.simple.demo.algorithm;
    
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    /**
     * 一致性哈希
     *
     * @Author peanutnowing
     * @Date 2020/7/8
     */
    public class TreeMapConsistentHash {
    
        private TreeMap<Long,String> treeMap = new TreeMap<>();
    
        /**
         * 自定义虚拟节点数量
         */
        private static final int VIRTUAL_NODE_NUM = 10;
    
        /**
         * 增加普通节点
         */
        public void add (String key,String value)  {
            long hash  = hash(key);
            treeMap.put(hash,value);
        }
    
        /**
         * 存在虚拟节点
         */
        public void addVirtualNode(String key,String value)  {
            for  (int i = 0; i < VIRTUAL_NODE_NUM; i++)  {
                long  hash  =  hash(key  +  "&&VIR"  +  i);
                treeMap.put(hash,  value);
            }
            treeMap.put(hash(key),  value);
        }
    
        /**
         * 读取节点值
         * @param key
         * @return
         */
        public String getNode(String  key)  {
            long  hash = hash(key);
            SortedMap<Long, String> sortedMap = treeMap.tailMap(hash);
            String  value;
            if (!sortedMap.isEmpty())  {
                value = sortedMap.get(sortedMap.firstKey());
            } else  {
                value = treeMap.firstEntry().getValue();
            }
    
            return value;
        }
    
        /**
         * 使用FNV1_32_HASH
         */
        public  long hash(String  key)  {
            final int p = 16777619;
            int  hash = (int)2166136261L;
            for(int i = 0; i < key.length(); i++)  {
                hash =  (hash ^ key.charAt(i)) * p;
            }
            hash  +=  hash  <<  13;
            hash  ^=  hash  >>  7;
            hash  +=  hash  <<  3;
            hash  ^=  hash  >>  17;
            hash  +=  hash  <<  5;
            // 如果算出来的值为负数则取其绝对值
            if  (hash  <  0)  {
                hash = Math.abs(hash);
            }
            return  hash;
        }
    
    
    }
    

    相关文章

      网友评论

          本文标题:用你熟悉的编程语言实现一致性 hash 算法

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