user:随机id 生成,落点由字符串哈希决定。把哈希值空间想象成一个首尾相连的圆环(0 ~ 2³²-1)。每个节点通过哈希函数被映射到环上的一个或多个点;每个 key 也被哈希到环上一个点,然后顺时针找到第一个节点,这个 key 就归它管。
为了让负载更均匀,真实系统会给每个物理节点生成多个"虚拟节点"(本页可调),分散插在环的不同位置。
朴素方案是 hash(key) % N。这在 N 固定时很好用,但只要 N 变化(扩容/缩容/故障),几乎所有 key 的取模结果都会变,等于全量重新分布——缓存系统会瞬间大规模穿透,数据库分片要整体搬迁。
一致性哈希把"是否迁移"变成了局部问题:新节点只切走顺时针方向紧邻它的那一段区间,其余 key 的归属完全不受影响。
环结构让"重新定位"变成局部操作——只有环上相邻的一小段区间会因为节点增减而改变归属,迁移量与 1/N 成正比,而不是接近 100%。
虚拟节点解决了"环上只有几个点时分布不均"的问题:物理节点数少时,实际管理的弧长可能差异很大;把每个物理节点拆成几十上百个虚拟点均匀撒在环上,大数定律会把负载磨平。这也是 Dynamo、Cassandra、Ketama 等真实系统的做法。