久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

一致性哈希算法的java實現是怎樣的

171次閱讀
沒有評論

共計 2511 個字符,預計需要花費 7 分鐘才能閱讀完成。

這篇文章給大家介紹一致性哈希算法的 java 實現是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

今天我們用 java 來實現一下,一致性哈希算法,重點還是一致性和虛擬節點 2 個方面。

廢話少說,直接上代碼:

public class ConsistencyHash {
  private TreeMap Long, String nodes = null;
   
  private List String shards = new ArrayList String
   
  private int VIRTUAL_NUM = 4;

   
  public void init() {
  shards.add(10.10.0.0- 服務器 0
  shards.add(10.10.0.1- 服務器 1
  shards.add(10.10.0.2- 服務器 2
  shards.add(10.10.0.3- 服務器 3
  shards.add(10.10.0.4- 服務器 4

  nodes = new TreeMap Long, String
  for (int i = 0; i shards.size(); i++) {
  String shardInfo = shards.get(i);
  for (int j = 0; j VIRTUAL_NUM; j++) {
  byte[] md5Value = computeMd5( SHARD- + i + -NODE- + j);
  long hashCode = hash(md5Value, j);
  System.out.println(hashCode);
  nodes.put(hashCode, shardInfo);
  }
  }
   
  Iterator Long iter = nodes.keySet().iterator();
  while(iter.hasNext()){
  Long key = iter.next();
  String obj = (String)nodes.get(key);
  System.out.println(String.valueOf(key) + : + obj);
  }
  }

   
  public Object getShardInfo(long hash) {
  Long key = hash;
  SortedMap Long, String tailMap = nodes.tailMap(key);
  if (tailMap.isEmpty()) {
  key = nodes.firstKey();
  } else {
  key = tailMap.firstKey();
  }
  return nodes.get(key);
  }

   
  public void printMap() {
  System.out.println(nodes);
  }

   
  public long hash(byte[] digest, int nTime) {
  long rv = ((long) (digest[3 + nTime * 4] 0xFF) 24) | ((long) (digest[2 + nTime * 4] 0xFF) 16)
  | ((long) (digest[1 + nTime * 4] 0xFF) 8) | (digest[0 + nTime * 4] 0xFF);

  return rv 0xffffffffL; /* Truncate to 32-bits */
  }

  /**
  * Get the md5 of the given key. 計算 MD5 值
  */
  public byte[] computeMd5(String k) {
  MessageDigest md5;
  try {
  md5 = MessageDigest.getInstance(MD5
  } catch (NoSuchAlgorithmException e) {
  throw new RuntimeException(MD5 not supported , e);
  }
  md5.reset();
  byte[] keyBytes = null;
  try {
  keyBytes = k.getBytes(UTF-8
  } catch (UnsupportedEncodingException e) {
  throw new RuntimeException(Unknown string : + k, e);
  }

  md5.update(keyBytes);
  byte[] res = md5.digest();
  return res;
  }

  public static void main(String[] args) {
  Random ran = new Random();
  ConsistencyHash hash = new ConsistencyHash();
  hash.init();
  hash.printMap();

  for (int i = 0; i 256; i++) {
  int randomVirtualServer = ran.nextInt(hash.VIRTUAL_NUM);
  byte[] md5Value = hash.computeMd5(String.valueOf(i));
  long hashValue = hash.hash(md5Value, randomVirtualServer);
  String serverInfo = (String)hash.getShardInfo(hashValue);
  System.out.println(serverInfo);
  }
  }
}

環境:假定為 5 臺真實服務器,每臺真實服務器對應 4 個虛擬節點,這樣就是 20 個服務節點。

首先是 init() 方法,該方法就是把 20 個服務節點,分布在一個 2^32 的圓環上。這里分為 2 步,首先根據形如“SHARD-2-NODE-3”這樣的字符串得到一個 16 個長度的 byte 數組;之后根據這個 byte 數組獲得 2^32 范圍內的哈希值。

然后假定 256 個數據對象,我們需要為他們分別找到一個服務節點。

根據一致性的定義,我們需要根據這 256 個數據對象,分別一個 2^32 范圍內的哈希值,為了方便起見,我們采取和服務節點一致的方法。

之后,在 getShardInfo 方法當中,在圓環內,為他們尋找各自所屬的服務節點。

關于一致性哈希算法的 java 實現是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-17發表,共計2511字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 灌南县| 长沙县| 嘉荫县| 大关县| 英超| 大埔县| 清河县| 饶平县| 孝义市| 庆城县| 建瓯市| 文水县| 明水县| 伊宁市| 陇川县| 田阳县| 伊川县| 沁源县| 措美县| 江都市| 台前县| 嘉黎县| 无锡市| 阳谷县| 德惠市| 湖口县| 云和县| 永安市| 阿瓦提县| 措勤县| 金坛市| 丽水市| 宣汉县| 随州市| 马边| 水富县| 抚远县| 连江县| 长葛市| 鹰潭市| 商都县|