美文网首页
用你熟悉的编程语言实现一致性 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