Prečítaj kód pozorne
import hashlib
KEYS = [f"key:{i}" for i in range(10_000)]
def h(s):
return int(hashlib.md5(s.encode()).hexdigest(), 16)
def naive_assign(keys, n):
return {k: h(k) % n for k in keys}
# Ring with VNODES virtual nodes per server keeps the distribution even.
VNODES = 150
def ring(nodes):
points = []
for n in nodes:
for v in range(VNODES):
points.append((h(f"{n}#{v}"), n))
points.sort()
return points
def consistent_assign(keys, nodes):
points = ring(nodes)
out = {}
for k in keys:
hk = h(k)
# walk clockwise to the first ring point >= hk; wrap to points[0] otherwise
lo, hi = 0, len(points)
while lo < hi:
mid = (lo + hi) // 2
if points[mid][0] < hk: lo = mid + 1
else: hi = mid
out[k] = points[lo % len(points)][1]
return out
before_nodes = [f"s{i}" for i in range(8)]
after_nodes = [f"s{i}" for i in range(9)]
n_before = naive_assign(KEYS, 8)
n_after = naive_assign(KEYS, 9)
c_before = consistent_assign(KEYS, before_nodes)
c_after = consistent_assign(KEYS, after_nodes)
naive_moved = sum(1 for k in KEYS if n_before[k] != n_after[k])
consistent_moved = sum(1 for k in KEYS if c_before[k] != c_after[k])
print(naive_moved, consistent_moved)Čo program vypíše? Napíš sem: