免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
一致性HASH算法的JAVA實(shí)現(xiàn)
        一致性哈希算法是分布式系統(tǒng)中常用的算法。比如,一個(gè)分布式的存儲(chǔ)系統(tǒng),要將數(shù)據(jù)存儲(chǔ)到具體的節(jié)點(diǎn)上,如果采用普通的hash方法,將數(shù)據(jù)映射到具體的節(jié)點(diǎn)上,如key%N,key是數(shù)據(jù)的key,N是機(jī)器節(jié)點(diǎn)數(shù),如果有一個(gè)機(jī)器加入或退出這個(gè)集群,則所有的數(shù)據(jù)映射都無(wú)效了,如果是持久化存儲(chǔ)則要做數(shù)據(jù)遷移,如果是分布式緩存,則其他緩存就失效了。
        一致性Hash算法將 value 映射到一個(gè) 32 為的 key 值,也即是 0~2^32-1 次方的數(shù)值空間;我們可以將這個(gè)空間想象成一個(gè)首( 0 )尾( 2^32-1 )相接的圓環(huán)。
如下圖所示:





Java代碼  
  1. package hash;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4. import java.nio.ByteBuffer;  
  5. import java.nio.ByteOrder;  
  6. import java.security.MessageDigest;  
  7. import java.security.NoSuchAlgorithmException;  
  8. import java.util.*;  
  9.   
  10. /** 
  11.  * Created by IntelliJ IDEA. 
  12.  * User: test 
  13.  * Date: 12-5-24 
  14.  * Time: 下午5:37 
  15.  * To change this template use File | Settings | File Templates. 
  16.  */  
  17. public class ConsistencyHash {  
  18.     private TreeMap<Long,Object> nodes = null;  
  19.     //真實(shí)服務(wù)器節(jié)點(diǎn)信息  
  20.     private List<Object> shards = new ArrayList();  
  21.     //設(shè)置虛擬節(jié)點(diǎn)數(shù)目  
  22.     private int VIRTUAL_NUM = 4;  
  23.   
  24.     /** 
  25.      * 初始化一致環(huán) 
  26.      */  
  27.     public void init() {  
  28.          shards.add("192.168.0.0-服務(wù)器0");  
  29.          shards.add("192.168.0.1-服務(wù)器1");  
  30.          shards.add("192.168.0.2-服務(wù)器2");  
  31.          shards.add("192.168.0.3-服務(wù)器3");  
  32.          shards.add("192.168.0.4-服務(wù)器4");  
  33.   
  34.         nodes = new TreeMap<Long,Object>();  
  35.         for(int i=0; i<shards.size(); i++) {  
  36.             Object shardInfo = shards.get(i);  
  37.             for(int j=0; j<VIRTUAL_NUM; j++) {  
  38.                 nodes.put(hash(computeMd5("SHARD-" + i + "-NODE-" + j),j), shardInfo);  
  39.             }  
  40.         }  
  41.     }  
  42.   
  43.     /** 
  44.      * 根據(jù)key的hash值取得服務(wù)器節(jié)點(diǎn)信息 
  45.      * @param hash 
  46.      * @return 
  47.      */  
  48.     public Object getShardInfo(long hash) {  
  49.         Long key = hash;  
  50.         SortedMap<Long, Object> tailMap=nodes.tailMap(key);  
  51.         if(tailMap.isEmpty()) {  
  52.             key = nodes.firstKey();  
  53.         } else {  
  54.             key = tailMap.firstKey();  
  55.         }  
  56.         return nodes.get(key);  
  57.     }  
  58.   
  59.     /** 
  60.      * 打印圓環(huán)節(jié)點(diǎn)數(shù)據(jù) 
  61.      */  
  62.      public void printMap() {  
  63.          System.out.println(nodes);  
  64.      }  
  65.   
  66.     /** 
  67.      * 根據(jù)2^32把節(jié)點(diǎn)分布到圓環(huán)上面。 
  68.      * @param digest 
  69.      * @param nTime 
  70.      * @return 
  71.      */  
  72.       public long hash(byte[] digest, int nTime) {  
  73.         long rv = ((long) (digest[3+nTime*4] & 0xFF) << 24)  
  74.                 | ((long) (digest[2+nTime*4] & 0xFF) << 16)  
  75.                 | ((long) (digest[1+nTime*4] & 0xFF) << 8)  
  76.                 | (digest[0+nTime*4] & 0xFF);  
  77.   
  78.         return rv & 0xffffffffL; /* Truncate to 32-bits */  
  79.       }  
  80.   
  81.     /** 
  82.      * Get the md5 of the given key. 
  83.      * 計(jì)算MD5值 
  84.      */  
  85.      public byte[] computeMd5(String k) {  
  86.         MessageDigest md5;  
  87.         try {  
  88.             md5 = MessageDigest.getInstance("MD5");  
  89.         } catch (NoSuchAlgorithmException e) {  
  90.             throw new RuntimeException("MD5 not supported", e);  
  91.         }  
  92.         md5.reset();  
  93.         byte[] keyBytes = null;  
  94.         try {  
  95.             keyBytes = k.getBytes("UTF-8");  
  96.         } catch (UnsupportedEncodingException e) {  
  97.             throw new RuntimeException("Unknown string :" + k, e);  
  98.         }  
  99.   
  100.         md5.update(keyBytes);  
  101.         return md5.digest();  
  102.      }  
  103.   
  104.      public static void main(String[] args) {  
  105.          Random ran = new Random();  
  106.          ConsistencyHash hash = new ConsistencyHash();  
  107.          hash.init();  
  108.          hash.printMap();  
  109.          //循環(huán)50次,是為了取50個(gè)數(shù)來(lái)測(cè)試效果,當(dāng)然也可以用其他任何的數(shù)據(jù)來(lái)測(cè)試  
  110.          for(int i=0; i<50; i++) {  
  111.              System.out.println(hash.getShardInfo(hash.hash(hash.computeMd5(String.valueOf(i)),ran.nextInt(hash.VIRTUAL_NUM))));  
  112.          }  
  113.    }  
  114.   
  115. }  
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
一致性Hash算法(KetamaHash)的c#實(shí)現(xiàn)
一致性hash算法java代碼實(shí)現(xiàn)
redis 一致性hash
搜索之路:Elasticsearch的誕生
一致性哈希負(fù)載均衡算法的探討
Phinecos(洞庭散人) 專注于開(kāi)源技術(shù)的研究與應(yīng)用 深入剖析SolrCloud(一)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服