Przejdź do treści głównej
🔒 Tryb podglądu. Pierwszych piętnaście lekcji Foundations jest darmowych; ta jest Pro. Rozpocznij 7-dniowy trial, aby odblokować edytor, podpowiedzi AI i resztę kursu. Wymagana karta, anulujesz w dowolnym momencie w Dashboard.Rozpocznij 7-dniowy trial →
← KursySystem Design for Python JuniorsModuł 2 · Skalowalność i buforowanieKonsekwentne hashowaniepredict17 / 105
+100 XP
Zadanie
📝 **Pytanie:** Przewiduj dokładną linię, którą wypisuje skrypt — `<naive_moved> <consistent_moved>` — gdy 10 000 kluczy zostanie przemapowanych z 8 węzłów na 9. 📋 Wybierz właściwą odpowiedź. 💡 **Wskazówka:** Jeśli nie jesteś pewien, przeczytaj ponownie powyższą teorię.
Przewiduj wynik

Przeczytaj kod uważnie

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)

Co wypisze program? Napisz tutaj:

💬 Dyskusja

Zadaj pierwsze pytanie lub podziel się wskazówką.
Zaloguj się aby dołączyć do dyskusji. Czytanie jest darmowe.
Ładowanie dyskusji…