Lesson 14 / 32

Consistent Hashing

Mapping keys to nodes so scaling doesn't reshuffle everything.

The rehashing problem

With plain hash(key) % N sharding, adding or removing one node changes N and remaps almost every key — a massive, unnecessary data shuffle.

A ring of lockers

Consistent hashing places both nodes and keys on a ring (a hash circle). A key belongs to the first node found clockwise from it. Adding a node only steals keys from its immediate neighbor — everyone else is untouched.

Virtual nodes

Give each physical node many points on the ring (virtual nodes) so load spreads evenly instead of depending on random placement.

ring = {}
for node in nodes:
  for v in range(150):  # virtual replicas
    ring[hash(node + str(v))] = node

def lookup(key):
  h = hash(key)
  return ring[first_point_clockwise_from(h)]

Output:

More virtual nodes = smoother load distribution

Where it's used

Consistent hashing powers cache clusters (Memcached clients), CDNs, and distributed databases like Cassandra and DynamoDB — anywhere nodes join or leave and you want minimal data movement.