直接用 std::hash 不行,因其无法感知节点变化,导致增减节点时所有键重映射;一致性哈希需将节点和键映射至同一逻辑环,通过虚拟节点均匀分布,并用 std::map 维护有序哈希环,配合 upper_bound 与回绕实现顺时针查找,且须统一哈希种子与虚拟节点数。

为什么直接用 std::hash 不行?
一致性哈希的核心不是“算得快”,而是“节点增减时,尽可能少地迁移键”。std::hash 对同一输入稳定,但对节点变化完全无感知——加一台机器,所有 key % node_count 都得重算,违背设计初衷。必须把节点映射到一个逻辑环上,再让 key 落在顺时针最近的节点。虚拟节点(virtual node)就是解决真实节点在环上分布不均的问题:每个物理节点对应多个哈希值(比如 100 个),分散插进环里,降低偏斜。
怎么构造带虚拟节点的哈希环?
用 std::map 最直接:key 是虚拟节点哈希值(uint64_t 足够覆盖 MD5 前 8 字节或 MurmurHash3 输出),value 是对应物理节点标识(如 "192.168.1.10:8080")。插入时循环生成虚拟节点哈希:
std::unordered_map
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











