您好,登錄后才能下訂單哦!
這篇文章給大家介紹一致性哈希算法的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實現是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。