Mercurial
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/async_multi_threads/consistent_hash.py Thu Dec 25 20:07:46 2025 -0800 @@ -0,0 +1,32 @@ +# 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)