一致性hash演算法的實現

2021-07-12 01:42:22 字數 1178 閱讀 5884

一致性hash演算法的實現

2014-01-21      

0 收藏   

1.hashcode的計算,字串hash演算法

有很多hash演算法,字串hash需要達到的兩個目標就是衝突要少,也就是分散和考慮到每個字元

參考:字串hash分析

jdk中使用的累乘因子為31的bkdrhash演算法,這是乙個經驗數字,具有相對比較好的效率和分散。暴雪使用的hash演算法主要是針對效率的。

為了盡量發散,使用jdk中hashmap的方法。

public int hash(string str)
2.一致性hash的思想

假如現在是客戶需要伺服器來服務,但是有多個伺服器,需要選擇乙個,客戶hash後得到乙個int型的數h,但是現在只有n個伺服器,怎麼來選擇伺服器呢?

傳統的取餘方法是:h%n 得到乙個小於n的數,再對應是那乙個伺服器就行。

但是這樣帶來乙個很嚴重的問題,擴充套件性。當需要新增乙個伺服器時(或者崩潰),重新計算h%(n+1),其中有些客戶端就需要變更伺服器。這將會給系統帶來很多不必要的損失。

所以一致性hash就是為了生存在動態伺服器內的。

首先求出伺服器的雜湊值, 並將其配置到0~2^32的圓上。 然後用同樣的方法求出客戶端的雜湊值,並對映到圓上。 然後從資料對映到的位置開始順時針查詢,第乙個伺服器服務它。 如果超過2^32找不到伺服器,就會儲存到第一台伺服器上。

使用虛擬節點的思想,為每個伺服器在圓上分配100~200個點。這樣就能抑制分布不均勻, 最大限度地減小伺服器增減時的快取重新分布。

//c為client客戶端,s為service伺服器

public class consistenthash

public consistenthash(int virtualnum)

//新增伺服器結點

public void add(s s)

//刪除伺服器結點

public void remove(s s)

//獲取伺服器

public s get(c c)

//再次分散的hash方法

private int hash(object o)

}

一致性hash演算法 面試必備 一致性hash演算法

最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...

一致性hash演算法虛擬節點 一致性hash演算法

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...

一致性hash演算法

july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...