Към основното съдържание
🔒 Режим за преглед. Първите петнадесет урока на Foundations са безплатни; този е Pro. Стартирайте 7-дневен trial, за да отключите редактора, AI подсказките и останалата част от курса. Изисква се карта, отменете по всяко време в Dashboard.Стартирай 7-дневен trial →
← КурсовеSystem Design for Python JuniorsМодул 2 · Скалируемост и кеширанеПоследователно хеширанеpredict17 / 105
+100 XP
Задача
📝 **Въпрос:** Предскажете точния ред, който скриптът отпечатва — `<naive_moved> <consistent_moved>` — когато 10 000 ключа са преназначени от 8 възела на 9. 📋 Изберете правилния отговор. 💡 **Съвет:** Прочетете отново теорията по-горе, ако не сте сигурни.
Предскажи изхода

Прочети кода внимателно

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)

Какво ще изведе програмата? Напиши тук:

💬 Дискусия

Бъди първи — задай въпрос или сподели съвет.
Влез за да се присъединиш към дискусията. Четенето е безплатно.
Зареждане на дискусията…