``` import hashlib class ConsistentHashing: def __init__(self, servers): self.servers = servers self.ring = {} self.sorted_keys = [] # Добавляем серверы на кольцо for server in servers: self.add_server(server) def add_server(self, server): # Добавляем сервер на кольцо и вычисляем хеш-значение hash_value = self.hash(server) self.ring[hash_value] = server self.sorted_keys.append(hash_value) self.sorted_keys.sort() def remove_server(self, server): # Удаляем сервер с кольца hash_value = self.hash(server) del self.ring[hash_value] self.sorted_keys.remove(hash_value) def get_server(self, key): if not self.ring: return None # Вычисляем хеш-значение ключа key_hash = self.hash(key) # Находим ближайший сервер в кольце for ring_key in self.sorted_keys: if key_hash <= ring_key: return self.ring[ring_key] # Если ключ находится за пределами хеш-кольца, используем первый сервер return self.ring[self.sorted_keys[0]] def hash(self, key): # Преобразуем ключ в хеш-значение с использованием SHA-1 return int(hashlib.sha1(key.encode()).hexdigest(), 16) # Пример использования servers = ["Server1", "Server2", "Server3"] consistent_hashing = ConsistentHashing(servers) # Получение сервера для ключа key = "SomeKey" selected_server = consistent_hashing.get_server(key) print(f"Key '{key}' будет обработан сервером: {selected_server}") ```` Этот подход имеет следующие преимущества. * При добавлении или удалении серверов перераспределяется минимальное количество ключей. * Его легко горизонтально масштабировать, так как данные распределены более равномерно. * Минимизация проблемы «горячих» ключей. Чрезмерный доступ к какому-то определенному сегменту может привести к перегрузке сервера.