一致性雜湊演算法與傳統雜湊演算法的對比

2021-08-21 06:58:49 字數 2343 閱讀 3704

1. 傳統雜湊演算法

傳統的雜湊演算法比較均勻的將資料分配到節點上。它依賴的hash演算法(實現用的是md5演算法)能夠比較隨機的分布。

from hashlib import md5

from struct import unpack_from

items = 10000000

nodes = 100

node_stat = [0 for i in range(nodes)]

for item in range(items):

k = md5(str(item)).digest()

h = unpack_from(">i", k)[0]

n = h % nodes

node_stat[n] += 1

但是存在乙個問題,傳統的雜湊演算法使用節點數取餘的方法,強依賴節點的數目,因此,當節點數改變時,資料項所對應的節點會發生劇烈變化。

from hashlib import md5

from struct import unpack_from

items = 10000000

nodes = 100

new_nodes = 101

change = 0

for item in range(items):

k = md5(str(item)).digest()

h = unpack_from(">i", k)[0]

n = h % nodes

n_new = h % new_nodes

if n_new != n:

change += 1

2. 一致性雜湊演算法

而一致性雜湊演算法具有許多優點,被廣泛應用。當增加或者刪除節點時,對於大多數資料項,一致性雜湊演算法保證原來分配到的某個節點,現在仍然應該分配到那個節點。

from hashlib import md5

from struct import unpack_from

from bisect import bisect_left

items = 10000000

nodes = 100

new_nodes = 101

change = 0

ring =

new_ring =

def _hash(value):

k = md5(str(value)).digest()

ha = unpack_from(">i", k)[0]

return ha

for n in range(nodes):

ring.sort()

for n in range(new_nodes):

new_ring.sort()

for item in range(items):

h = _hash(item)

n = bisect_left(ring, h) % nodes

new_n = bisect_left(new_ring, h) % new_nodes

if new_n != n:

change += 1

一致性雜湊演算法也有缺點,資料在節點上分布不均勻。和傳統雜湊演算法相比,資料本身的雜湊值不變,變化的是資料雜湊值應該對映到哪個節點的演算法。

from hashlib import md5

from struct import unpack_from

from bisect import bisect_left

items = 10000000

nodes = 100

node_stat = [0 for i in range(nodes)]

ring =

hash2node = {}

def _hash(value):

k = md5(str(value)).digest()

ha = unpack_from(">i", k)[0]

return ha

for n in range(nodes):

h = _hash(n)

ring.sort()

hash2node[h] = n

for item in range(items):

h = _hash(item)

n = bisect_left(ring, h) % nodes

node_stat[hash2node[ring[n]]] += 1

為了解決資料分布不均勻的問題,一致性雜湊演算法引入虛擬節點機制。

虛擬節點是實際節點(機器)在雜湊空間的複製,每個實際節點(機器)對應若干個虛擬節點。

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...