如下皆爲我的理解:java
一致性哈希是爲了解決在分佈式環境中,集羣擴容(或者縮容)面臨的一個問題。算法
若是原來集羣由4個服務器組成,若使用普通hash算法,可能就是按照 key%4 來hash,若是這個須要擴容,由4個服務器擴容到6個服務,那麼就不得不把全部存儲的內容拿出來從新hash(Java中hashMap就是這麼作的)。顯然這樣作的成本太大。數組
1. 若是問題中的hash算法不是 %4 ,而是%(取模)一個很大的數,那麼當擴容的時候,就不須要把全部存儲的內容拿出來hash,例如原來是1,2,3,4號機器,如今進行擴容成6臺。服務器
這樣作的問題很明顯,破壞了hash的均勻性。分佈式
若是不直接把hash後的值不直接映射到機器上,而是在中間加一個虛擬節點(聯想一下c中的指針或者java中的引用,例如java中的數組,每次增長的或者刪除的時候,並非真的把object的內容放進進去,而是放入的是引用)。spa
這樣是否是好得多了,這樣在每一個虛擬節點中保存一份對物理服務器的映射指針
一致性hash的算法,和上面相似,只不過是查找方法的不同,hash
一致性hash事先分配一個2^32桶,而後首尾相連,構成一個環,把key hash到這個環中,同時也把服務器hash到這個環中,那麼key和服務器都在這個環中,而後找出key對應的映射服務器則是把key順時針搜索到的第一個服務器。集羣
若是把一個服務器在這環中存在多個節點,每一個他映射的節點就是一個他的虛擬節點object