1. 程式人生 > >一致性雜湊演算法(consistent hashing)例子+測試。

一致性雜湊演算法(consistent hashing)例子+測試。

一個簡單的consistent hashing的例子,很容易理解。

首先有一個裝置類,定義了機器名和ip:

public class Cache
{
	public String name;
	public String ipAddress;
}

然後是主要的實現:

public class Shard<T> { 
	//hash 演算法並不是保證絕對的平衡,如果 cache 較少的話,物件並不能被均勻的對映到 cache 上,
	//所以增加虛擬節點
	private TreeMap<Long, T> nodes;
	private List<T> shards; //節點碎片
	private final int NODE_NUM = 10; // 每個機器節點關聯的虛擬節點個數

	public Shard(List<T> shards) {
		this.shards = shards;
		init();
	}

	private void init() { 
		nodes = new TreeMap<Long, T>();
		for (int i = 0; i < shards.size(); i++) 
		{ // 遍歷真實節點
			final T shardInfo = shards.get(i);
			
			for (int n = 0; n < NODE_NUM; n++)
			{
				// 真實節點關聯虛擬節點,真實節點是VALUE;
				nodes.put((long) Hash("SHARD-" + i + "-NODE-" + n), shardInfo);
			}
			System.out.println(shardInfo);
		}
	}

	public T getShardInfo(String key) {
		SortedMap<Long, T> tail = nodes.tailMap((long) Hash(key)); 
		if (tail.size() == 0) {
			return nodes.get(nodes.firstKey());
		}
		//找到最近的虛擬節點
		return tail.get(tail.firstKey());
	}
	
	/**
     * 改進的32位FNV演算法,高離散
     * 
     * @param string
     *            字串
     * @return int值
     */
    public static int Hash(String str) 
    {
        final int p = 16777619;
        int hash = (int) 2166136261L;
        for (byte b : str.getBytes())
            hash = (hash ^ b) * p;
        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;
        return hash;
    }

}


到這裡就完了,是不是很簡單,下面來測試下:

public class Test
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		List<Cache> myCaches=new ArrayList<Cache>();
		Cache cache1=new Cache();
		cache1.name="COMPUTER1";
		Cache cache2=new Cache();
		cache2.name="COMPUTER2";
		myCaches.add(cache1);
		myCaches.add(cache2);
		
		
		Shard<Cache> myShard=new Shard<Cache>(myCaches);
		
		Cache currentCache=myShard.getShardInfo("info1");
		System.out.println(currentCache.name);
		
//		for(int i=0;i<20;i++)
//		{
//			String object=getRandomString(20);//產生20位長度的隨機字串
//			Cache currentCache=myShard.getShardInfo(object);
//			System.out.println(currentCache.name);
//		}
		
		
	}
	
	public static String getRandomString(int length) { //length表示生成字串的長度
	    String base = "abcdefghijklmnopqrstuvwxyz0123456789";   
	    Random random = new Random();   
	    StringBuffer sb = new StringBuffer();   
	    for (int i = 0; i < length; i++) {   
	        int number = random.nextInt(base.length());   
	        sb.append(base.charAt(number));   
	    }   
	    return sb.toString();   
	 }   

}


我們有兩臺裝置,computer1和computer2,第一次初始化要構建一個2的32次方的環,並往上面放裝置。這個環由改進的FNV演算法實現。位置也由hash演算法確定。

但我們只有兩臺裝置,很明顯在環上會分佈不均勻(這個就不解釋了,網上很多資料)。於是我們每臺裝置增加10個虛擬裝置。

最後分佈如下:

[email protected],
[email protected],
[email protected],
[email protected],
[email protected],
[email protected],
[email protected]
, [email protected], [email protected], [email protected]

-2147483648到2147483647之間是不是比較均勻,這是java的,如果是c#的就是0~2的32次方。我們hash計算出KEY值為2049553054,然後順時針找到最近的位置,即為

[email protected]

結果我們定位到了COMPUTER1

最好我們要看看平衡性如何:取消上面註釋的程式碼,迴圈20次,得到結果如下:

COMPUTER1
COMPUTER2
COMPUTER1
COMPUTER2
COMPUTER1
COMPUTER2
COMPUTER1
COMPUTER1
COMPUTER1
COMPUTER2
COMPUTER2
COMPUTER2
COMPUTER1
COMPUTER2
COMPUTER1
COMPUTER1
COMPUTER1
COMPUTER2
COMPUTER1
COMPUTER2

大家可以自己取試試,

FNV雜湊演算法是一種高離散性的雜湊演算法,特別適用於雜湊非常相似的字串,例如:URL,IP,主機名,檔名等。

以下服務使用了FNV:
1、calc
2、DNS
3、mdbm key/value查詢函式
4、資料庫索引hash
5、主流web查詢/索引引擎
6、高效能email服務
7、基於訊息ID查詢函式
8、auti-spam反垃圾郵件過濾器
9、NFS實現(比如freebsd 4.3, linux NFS v4)
10、Cohesia MASS project
11、Ada 95的spellchecker
12、開源x86彙編器:flatassembler   user-defined symbol hashtree
13、PowerBASIC
14、PS2、XBOX上的文字資源
15、非加密圖形檔案指紋
16、FRET
17、Symbian DASM
18、VC++ 2005的hash_map實現
19、memcache中的libketama
20、 PHP 5.x
21、twitter中用於改進cache碎片
22、BSD IDE project
23、deliantra game server
24、 Leprechaun
25、IPv6流標籤

相關推薦

一致性演算法consistent hashing例子+測試

一個簡單的consistent hashing的例子,很容易理解。 首先有一個裝置類,定義了機器名和ip: public class Cache { public String name; public String ipAddress; } 然後是主要的實現: pub

分散式一致性演算法一致性演算法consistent hashing

一 基本場景 比如你有 N 個 cache 伺服器(後面簡稱 cache ),那麼如何將一個物件 object 對映到 N 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 N 個 cache ; hash(o

一致性演算法consistent hashing

應用場景: 在做伺服器負載均衡時候可供選擇的負載均衡的演算法有很多,包括: 輪循演算法( RoundRobin)、雜湊演算法( HASH)、最少連線演算法( Least Connection)、響應速度演算法( ResponseTime)、加權法( Weight

一致性演算法consistent hash的黑科技

這是一個來自Google的零記憶體消耗、均勻、快速、簡潔的一致性雜湊演算法 – Jump Consistent Hash 演算法的作者是Google的John Lamping和Eric Veach,論文原文連結 – 點這裡,一些討論 – 點這裡 整篇文章基於對論文原文的翻譯,摻雜自己的

一致性演算法consistent hashing)

    一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡單雜湊演算法帶來的問題,使得分散式雜湊(DHT)可以在P2P環境

一致性 hash 演算法 consistent hashing

1 基本場景 比如你有 N 個 cache 伺服器(後面簡稱 cache ),那麼如何將一個物件 object 對映到 N 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 N 個 cache hash(obj

分散式memcache 一致性演算法採用環狀資料結構

  <?php #分散式memcache 一致性雜湊演算法(採用環狀資料結構) class ConsistentHashMemcache { private $virtualNode=''; #用於儲存虛擬節點個數 private $realN

理解一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

LintCode Consistent Hashing一致性演算法

一般的資料庫進行horizontal shard的方法是指,把 id 對 資料庫伺服器總數 n 取模,然後來得到他在哪臺機器上。這種方法的缺點是,當資料繼續增加,我們需要增加資料庫伺服器,將 n 變為 n+1 時,幾乎所有的資料都要移動,這就造成了不 consistent。為了減少這種 naive 的 ha

一致性Consistent Hashing原理

-轉自【http://afghl.github.io/2016/07/04/consistent-hashing.html】,僅供學習 看一些分散式相關的技術文章或書籍時,經常看到一個詞,一致性雜湊。對於這個技術一直似懂非懂。今天花了半天的時間好好研究了它的原理和實現,發現

每天進步一點點——五分鐘理解一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

一致性演算法(consistent hashing)

本文要解決的問題: 從原理上理解一致性雜湊演算法。 轉自:http://blog.csdn.net/cywosp/article/details/23397179/ 一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決

詳解一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

最近鄰和K近鄰及其優化演算法LSH區域性敏感,Locality Sensitive Hashing Kd-Tree

引言 在處理大量高維資料時,如何快速地找到最相似的資料是一個比較難的問題。如果是低維的小量資料,線性查詢(Linear Search)就可以解決,但面對海量的高維資料集如果採用線性查詢將會非常耗時。因此,為了解決該問題通常採用些優化演算法。稱之為近似最近鄰查詢

[轉]理解一致性演算法(consistent hashing)

[size=medium]一致性雜湊演算法原理[url]http://www.cnblogs.com/lpfuture/p/5796398.html[/url]白話解析一致性雜湊演算法(Excellent)[url]http://www.zsythink.net/archiv

Consistent Hashing 一致性演算法

按照我的理解方式 就是將所有的cache伺服器的標識分別hash到的值分佈到0-pow(2,32)中. 然後將你要取的key的hash值進行比較。取第一個大於key的hash值的伺服器。 如果從0-pow(2,32)也沒有找到,那麼則取最小hash值的伺服器。例如 上圖中, 伺服器 a 的hash值 為 1,

每天進步一點點——一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

Consistent Hashing一致性演算法

一、簡單介紹一致性雜湊演算法分散式儲存中,常常涉及到負載均衡問題,由於有多個數據儲存伺服器。因此當一個物件被儲存時候,它究竟應該存放到哪個資料儲存伺服器上面呢?這就是負載均問題。         又例如:現在假設有一個網站,最近發現隨著流量增加,伺服器壓力越來越大,之前直接

圖解一致性演算法,全網小區區域網最通俗易懂

很多同學應該都知道什麼是雜湊函式,在後端面試和開發中會遇到「一致性雜湊」,那麼什麼是一致性雜湊呢?名字聽起來很厲害的樣子,其實原理並不複雜,這篇文章帶你徹底搞懂一致性雜湊! 進入主題前,先來一場緊張刺激的模擬面試吧。 ![模擬面試表情.png](https://i.loli.net/2020/07/31/f

一致性哈希算法(consistent hashing)

理工學院 性問題 fcm dht 用戶 分享 虛擬節點 如果 滿足 轉自:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工學院提出的一種分布式哈希(DHT)實現算法,設計