传统hash方法有个令人诟病的缺点,就是在容量不够需要扩容的时候,所有原先存储的值都需要重新进行hash映射。
而一致性hash的目标就是为了解决这个缺点而相出的hash算法,尽可能地让重新hash的原值数变少。
附带一个中文wiki
一致hash只是一种想法,真的算法实现各有名称。
根据我对网上所说的最简单的一致hash方法的理解。这里我也简单说一下。
假设我的hash容量有 cap ,而我们实际的hash范围会比这个更大,为的是将一块区域的数值划分给槽,(所谓槽,是我的个人习惯。因为hash在我看来像是被分配到一个槽或者桶里,这里简称被hash之后的所有数值为槽)。
而每当增加一个槽(扩容),最简单的方法就是将相邻的槽里的一部分 分给新的槽。而每当减少一个槽(缩容),最简单的方法就是将它存储的数字转交给相邻的槽。
无论是扩容还是缩容,这个最简单的操作都能够使得重新hash的数量尽可能少。
然而,这个最简单的方法当然是不靠谱的,因为它首先在负载上是根本谈不上均衡的。
一个可行的解决办法是。
将原先的cap个大区域,分成cap个 若干小区域的集合。
怎么说呢,就比如。
原先是 111222333
现在变成 123123123
。但实际上每个 小区域 1 都会hash到 一个真正个节点。(可以说再hash?)
简单来说就是如此,对于面试来说应该足够,有这个算法的概念就好。