`
zhanghaj00
  • 浏览: 64087 次
社区版块
存档分类
最新评论

一致性 hash算法

 
阅读更多

面试被鄙视了 只能好好地学习了

 

一致性哈希算法,
   一致性哈希算法主要是解决分布式缓存中对于增加删除节点而导致的缓存失效的问题,
   这对比普通的hash缓存,我们通常在固定节点N的缓存服务器上是这样分配缓存的  hash(K)%N  这样,我们每次取缓存的时候都是按照N这个来取摸的,当N变成N+1或者其他,那我们所有的缓存就都失效了。这时候就要说一致性hash了
    一致性hash 算法主要是先把服务器给hash了,hash(server) 这样服务器就均匀的分布了(这里要加虚拟节点),然后我们再把hash(K)来和这些比较 ,看到在这个范围就放到结点里面,(其实都是数组的比较了,,因为hash算出来是一个2的32次方的数,然后服务器的hash就是一个一个的结点,K的hash就就和这些结点比较,然后在范围就放到一个节点里面)

   我理解的理论应该就是这样,那代码呢,代码在哪里

 

   import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

 

 


public class MyHash {

 
 private static TreeMap<Long, Node> treeMap;
 private static List<Node> list = new ArrayList<>();
 
 public MyHash(List<Node> list ){
  super();
  this.list = list;
  init();
 }
 public void init(){
  treeMap = new TreeMap<>();
  for(int i=0;i<list.size();i++){
   Node node  = list.get(i);
   treeMap.put(hash("SHARD-" + node.name + "-NODE-" + node.ip), node);
  }
 }
 
 
 public void putintoNode(String key){
  SortedMap<Long, Node> sort = treeMap.tailMap(hash(key));
  if (sort.size() == 0) {
   return;
  }
  treeMap.put(hash(key), sort.get(sort.firstKey()));
  
 }
 
 //添加一个虚拟节点进环形结构,lg为虚拟节点的hash值
  public void addS(Node s){
   /*Long ha = hash("SHARD-" + s.name + "-NODE-"+s.ip);
   SortedMap<Long, Node> tail = treeMap.tailMap(ha);
   SortedMap<Long,Node>  head = treeMap.headMap(ha);
   
   SortedMap<Long,Node> between;
   if(head.size()==0){
    
   }*/
   treeMap.put(hash("SHARD-" + s.name + "-NODE-"+s.ip), s);   
  }
  
 /**
  *  MurMurHash算法,是非加密HASH算法,性能很高,
  *  比传统的CRC32,MD5,SHA-1(这两个算法都是加密HASH算法,复杂度本身就很高,带来的性能上的损害也不可避免)
  *  等HASH算法要快很多,而且据说这个算法的碰撞率很低.
  *  http://murmurhash.googlepages.com/
  */
 private static Long hash(String key) {
  
  ByteBuffer buf = ByteBuffer.wrap(key.getBytes());
  int seed = 0x1234ABCD;
  
  ByteOrder byteOrder = buf.order();
        buf.order(ByteOrder.LITTLE_ENDIAN);

        long m = 0xc6a4a7935bd1e995L;
        int r = 47;

        long h = seed ^ (buf.remaining() * m);

        long k;
        while (buf.remaining() >= 8) {
            k = buf.getLong();

            k *= m;
            k ^= k >>> r;
            k *= m;

            h ^= k;
            h *= m;
        }

        if (buf.remaining() > 0) {
            ByteBuffer finish = ByteBuffer.allocate(8).order(
                    ByteOrder.LITTLE_ENDIAN);
            // for big-endian version, do this first:
            // finish.position(8-buf.remaining());
            finish.put(buf).rewind();
            h ^= finish.getLong();
            h *= m;
        }

        h ^= h >>> r;
        h *= m;
        h ^= h >>> r;

        buf.order(byteOrder);
        return h;
 }
 
 static class Node{
  String name;
  String ip;
  public Node(String name,String ip) {
   this.name = name;
   this.ip = ip;
  }
  @Override
  public String toString() {
   return this.name+"-"+this.ip;
  }
 }
}

分享到:
评论

相关推荐

    C++实现一致性hash算法

    一致性hash应用于负载均衡算法,本实现由C++语言开发。 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、平衡性(Balance)2、单调性(Monotonicity) 3、分散性(Spread)4、负载(Load)

    一致性哈希算法源码 Ketama一致性hash算法源码

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,旨在解决在分布式环境中数据分布不均匀的问题。Ketama算法是基于一致性哈希的一种优化实现,由Last.fm公司的Simon Willison提出,其目标是在...

    一致性Hash算法的原理及实现

    ### 一致性Hash算法的原理及实现 #### 一、引言 一致性Hash算法是一种用于解决分布式环境下数据存储和检索问题的重要技术。它最初由David Karger等人在1997年的论文《Consistent Hashing and Random Trees: ...

    对一致性Hash算法,Java代码实现的深入研究1

    【一致性Hash算法】是一种分布式系统中用于负载均衡的哈希算法。它的主要目的是解决当服务节点增加或减少时,能够尽量少地改变已有的请求分配,以保持系统的稳定性。在传统的哈希算法中,增加或删除一个服务器可能...

    C/C++ 一致性hash算法

    一致性哈希算法是一种分布式哈希(Distributed Hash Table, DHT)技术,它在处理大量数据分布到多个节点上时,能保持较好的均衡性和可扩展性。在C/C++编程中,一致性哈希通常用于构建分布式系统,如负载均衡、缓存...

    一致性hash算法简介.pdf

    一致性hash算法简介

    一致性hash算法简介加C++实现

    一致性hash算法简介加C++实现

    基于go语言实现的分布式缓存系统源码+项目说明(以键值对的形式存储数据,一致性hash算法选择存储节点).zip

    基于go语言实现的分布式缓存系统源码+项目说明(以键值对的形式存储数据,一致性hash算法选择存储节点,Protobuf通信协议编解码。用户输入查询请求后,会优先在缓存系统查询,查不到则使用回调函数去源数据库查询,...

    Ketama一致性Hash算法(含Java代码) 1

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。它的核心思想是通过哈希函数将对象映射到一个固定大小的环形空间中,然后将服务器也映射到这个...

    解决分布式数据插入数据库~一致性hash算法

    为了解决这个问题,可以采用跳数法(Jump Consistent Hash)或者更高级的一致性哈希变体,如Ketama或libketama。哈希冲突则可以通过开放寻址、链地址法等方法来解决。 此外,一致性哈希算法在分布式缓存如Memcached...

    SpringBoot_shardDB_shardTable:SpringBoot集成Sharding-JDBC实现分库分表,自定义分片算法,基于一致性hash算法,易于扩容

    一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....

    PHP实现的一致性Hash算法详解【分布式算法】

    主要介绍了PHP实现的一致性Hash算法,结合实例形式详细分析了php一致性Hash算法的概念、原理及相关实现与使用技巧,需要的朋友可以参考下

    一致性hash算法1

    一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的数据分布不均问题。该算法最早在1997年的论文《Consistent Hashing and Random Trees》中被...

    一致性Hash算法1

    一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式缓存系统中解决节点动态增减时导致的键值映射大量变更的问题。它最早在1997年的论文《Consistent hashing and random trees》中被...

    一致性hash算法(c++)

    一致性哈希算法是一种分布式哈希技术,用于解决在分布式缓存、负载均衡系统等场景下节点动态增减时,数据分布的稳定性和效率问题。它最初由麻省理工学院在1997年提出,目的是解决分布式缓存系统中如何均匀分配数据的...

    一个根据google maglev 论文,用c语言实现的一致性hash算法.zip

    一致性哈希算法是一种分布式系统中负载均衡的策略,它的核心思想是解决在分布式环境中如何将数据均匀地分配到各个节点的问题。Google Maglev论文中提出的一致性哈希算法是为了解决大型数据中心的网络路由问题,使得...

Global site tag (gtag.js) - Google Analytics