view async_multi_threads/consistent_hash.py @ 69:551d9fc0a2ba

Updated wrong names.
author June Park <parkjune1995@gmail.com>
date Thu, 25 Dec 2025 20:07:46 -0800
parents
children
line wrap: on
line source

# Write a function taht maps
# Key string to one of N servers
from bisect import bisect_left
from hashlib import sha256

class Server:

    def __init__(self):
        self.id = str(sha256())

class ConsistentHash:
    def __init__(self):
        self.server = []
        self.hash_key_to_server = {}
        self.hash_range = 10000

    def get_hash_pos(self, key: str) -> int:
        x = sha256(bytes(key, "utf-8"))
        return int.from_bytes(x.digest()[:8]) % self.hash_range

    def add_server(self, server: Server):
        self.server.append(server)
        for i in range(len(self.server) + 1):
            hash_key = self.get_hash_pos(server.id)
            self.hash_key_to_server[hash_key] = i

    def get_server(self, key):
        hash_key = self.get_hash_pos(key)
        return self.server[bisect_left(list(self.hash_key_to_server.keys()), hash_key)]

    def remove_server(self, server):
        hash_key = self.get_hash_pos(server.id)