1. 程式人生 > >對一致性Hash演算法,Java程式碼實現的深入研究

對一致性Hash演算法,Java程式碼實現的深入研究

 1 /**
 2  * 帶虛擬節點的一致性Hash演算法
 3  * @author 五月的倉頡 http://www.cnblogs.com/xrq730/
 4  */
 5 public class ConsistentHashingWithVirtualNode
 6 {
 7     /**
 8      * 待新增入Hash環的伺服器列表
 9      */
10     private static String[] servers = {"192.168.0.0:111", "192.168.0.1:111", "192.168.0.2:111",
11             "192.168.0.3:111", "192.168.0.4:111"};
12 13 /** 14 * 真實結點列表,考慮到伺服器上線、下線的場景,即新增、刪除的場景會比較頻繁,這裡使用LinkedList會更好 15 */ 16 private static List<String> realNodes = new LinkedList<String>(); 17 18 /** 19 * 虛擬節點,key表示虛擬節點的hash值,value表示虛擬節點的名稱 20 */ 21 private static SortedMap<Integer, String> virtualNodes = 22
new TreeMap<Integer, String>(); 23 24 /** 25 * 虛擬節點的數目,這裡寫死,為了演示需要,一個真實結點對應5個虛擬節點 26 */ 27 private static final int VIRTUAL_NODES = 5; 28 29 static 30 { 31 // 先把原始的伺服器新增到真實結點列表中 32 for (int i = 0; i < servers.length; i++)
33 realNodes.add(servers[i]); 34 35 // 再新增虛擬節點,遍歷LinkedList使用foreach迴圈效率會比較高 36 for (String str : realNodes) 37 { 38 for (int i = 0; i < VIRTUAL_NODES; i++) 39 { 40 String virtualNodeName = str + "&&VN" + String.valueOf(i); 41 int hash = getHash(virtualNodeName); 42 System.out.println("虛擬節點[" + virtualNodeName + "]被新增, hash值為" + hash); 43 virtualNodes.put(hash, virtualNodeName); 44 } 45 } 46 System.out.println(); 47 } 48 49 /** 50 * 使用FNV1_32_HASH演算法計算伺服器的Hash值,這裡不使用重寫hashCode的方法,最終效果沒區別 51 */ 52 private static int getHash(String str) 53 { 54 final int p = 16777619; 55 int hash = (int)2166136261L; 56 for (int i = 0; i < str.length(); i++) 57 hash = (hash ^ str.charAt(i)) * p; 58 hash += hash << 13; 59 hash ^= hash >> 7; 60 hash += hash << 3; 61 hash ^= hash >> 17; 62 hash += hash << 5; 63 64 // 如果算出來的值為負數則取其絕對值 65 if (hash < 0) 66 hash = Math.abs(hash); 67 return hash; 68 } 69 70 /** 71 * 得到應當路由到的結點 72 */ 73 private static String getServer(String node) 74 { 75 // 得到帶路由的結點的Hash值 76 int hash = getHash(node); 77 // 得到大於該Hash值的所有Map 78 SortedMap<Integer, String> subMap = 79 virtualNodes.tailMap(hash); 80 // 第一個Key就是順時針過去離node最近的那個結點 81 Integer i = subMap.firstKey(); 82 // 返回對應的虛擬節點名稱,這裡字串稍微擷取一下 83 String virtualNode = subMap.get(i); 84 return virtualNode.substring(0, virtualNode.indexOf("&&")); 85 } 86 87 public static void main(String[] args) 88 { 89 String[] nodes = {"127.0.0.1:1111", "221.226.0.1:2222", "10.211.0.1:3333"}; 90 for (int i = 0; i < nodes.length; i++) 91 System.out.println("[" + nodes[i] + "]的hash值為" + 92 getHash(nodes[i]) + ", 被路由到結點[" + getServer(nodes[i]) + "]"); 93 } 94 }

相關推薦

一致性Hash演算法Java程式碼實現深入研究

1 /** 2 * 帶虛擬節點的一致性Hash演算法 3 * @author 五月的倉頡 http://www.cnblogs.com/xrq730/ 4 */ 5 public class ConsistentHashingWithVirtualNode 6 { 7

一致性Hash演算法Java程式碼實現

一致性Hash演算法 關於一致性Hash演算法,在我之前的博文中已經有多次提到了,MemCache超詳細解讀一文中"一致性Hash演算法"部分,對於為什麼要使用一致性Hash演算法、一致性Hash演算法的演算法原理做了詳細的解讀。 演算法的具體原理這裡再次貼上: 先構造

【資料結構與演算法】回溯法解決N皇后問題java程式碼實現

N皇后問題 問題描述 在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法,這稱為八皇后問題。 延伸一下,便為N皇后問題。 核心思想 解決N皇后問題有兩個關鍵點。一是如何進行放置棋子,二是如何驗證棋子是否符合

銀行家演算法java程式碼實現Swing寫的介面

java程式碼實現了銀行家演算法,介面寫的個人認為還是較為細緻的,完整的實現了找安全序列等演算法功能,可作為參考學習銀行家演算法。 直接上程式碼:①介面展示方法:public void ShowFrame() { t

多種負載均衡演算法及其Java程式碼實現【網路上較好的轉載】

首先給大家介紹下什麼是負載均衡(來自百科) 負載均衡 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件 網路裝置和 伺服器的頻寬、增加 吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。 負載均衡,英文名稱為Load Balance,其意思就

常見14種經典排序演算法Java程式碼實現

尊重原創,轉載請標明出處   http://blog.csdn.net/abcdef314159 ,想了解更多演算法題可以關注微信公眾號“資料結構和演算法”,每天一題為你精彩解答。 一,氣泡排序 排序演算法其實有很多,氣泡排序基本上算是最簡單的一種

二分查詢演算法java程式碼實現

一、演算法思想 首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條

基於矩陣分解的推薦演算法java程式碼實現

目前推薦系統中用的最多的就是矩陣分解方法,在Netflix Prize推薦系統大賽中取得突出效果。以使用者-專案評分矩陣為例,矩陣分解就是預測出評分矩陣中的缺失值,然後根據預測值以某種方式向用戶推薦。常見的矩陣分解方法有基本矩陣分解(basic MF),正則化矩

中文轉換成Unicode編碼和Unicode編碼轉換成中文Java程式碼實現

 import java.util.Properties; public class Test { public static void main(String[] args

MATLAB實現FCM演算法簡單程式碼實現

先來看看結果好了,這是一幅原圖,經過FCM演算法之後,假設選擇3個center,將這幅彩色影象轉化後得到一個只有三種灰度值的影象,還能將每一種灰度單獨提取出來,得到對應的只含有一種灰度的三個圖。 它的數學原理為         這裡Vk取v1,v2,v3三個任意初始值

常用的八種排序演算法Java程式碼實現

1.直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數排序,然後構成一個有序序列 將第三個數插入進去,構成一個新的有序序列。 對第四個數、第五個數……直到最後一個數,重複第二步。

現代應用密碼學中橢圓曲線求點集E以及點乘演算法java程式碼實現

【問題】: (1)生成橢圓曲線有限域上的點集。給定p=211,a=0,b=-4 (2) 給定生成元G(2,2)找出其他點與生成元之間的關係。 【解答】:面多較大的有限域p,依靠手動計算以及不符合實際,因此我在理解橢圓曲線數學原理和點乘演算法的基礎上,用java程式編寫完

mahout推薦演算法——協同過濾推薦演算法java程式碼實現

什麼是協同過濾 協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麼做?大部分的人會問問周圍的朋友,看看最近有什麼好看的電影推

自己實現IOC容器java程式碼實現簡易版IOC容器IOC容器實現的步驟分解

一、需求   實現一個簡易的IOC容器,管理Bean,從IOC容器的BeanFactory中獲取例項,從而取代自己new例項的做法。 二、實現步驟分析 三、具體程式碼實現   自定義註解類 MyComponent 和 MyAutowired: 1 package MyIOCAnd

【轉載】一致性Hash算法Java代碼實現深入研究

困難 之前 存在 itl ger 正常 我不 操作 算法實現 原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 關於一致性Hash算法,在我之前的博文中已經有多次提到了,MemCache超詳細解讀一

一致性Hash算法Java代碼實現深入研究

memcach 還原 情況 () 實用 target 強人 最壞情況 一致性hash 一致性Hash算法 關於一致性Hash算法,在我之前的博文中已經有多次提到了,MemCache超詳細解讀一文中"一致性Hash算法"部分,對於為什麽要使用一致性Hash算法、一致性Has

一致性hash演算法 java程式碼實現與測試

轉載:http://blog.csdn.net/pcceo1/article/details/51493934 寫了一個一致性hash的Java實現程式碼,演算法是用別人的,據說很好,然後自己做了一個測試,用執行緒池起了1000個執行緒,每個執行緒hash10000次,模

買什麼資料結構與演算法這裡有:動態圖解十大經典排序演算法(含JAVA程式碼實現

上篇的動圖資料結構反響不錯,這次來個動圖排序演算法大全。資料結構與演算法,齊了。 幾張動態圖捋清Java常用資料結構及其設計原理 本文將採取動態圖+文字描述+正確的java程式碼實現來講解以下十大排序演算法: 氣泡排序 選擇排序 插入排序 希爾排序

一致性hash演算法程式碼實現

什麼是一致性hash 一致性雜湊演算法(Consistent Hashing Algorithm)是一種分散式演算法,常用於負載均衡。Memcached client也選擇這種演算法,解決將key-value均勻分配到眾多Memcached server上的問題。它可以取代傳統的取模操作

常用排序演算法java程式碼實現---快速排序氣泡排序選擇排序

快速排序 public class QuickSort { public void qSort(int[] arr,int left,int right) { if(left>right) { return ; } int i = le