Код: Выделить всё
public class ConsistentHashing {
private final TreeMap ring;
private final int numberOfReplicas;
private final MessageDigest md;
public ConsistentHashing(int numberOfReplicas) throws NoSuchAlgorithmException {
this.ring = new TreeMap();
this.numberOfReplicas = numberOfReplicas;
this.md = MessageDigest.getInstance("MD5");
}
public void addServer(String server) {
for (int i = 0; i < numberOfReplicas; i++) {
long hash = generateHash(server + i);
ring.put(hash, server);
}
}
public void removeServer(String server) {
for (int i = 0; i < numberOfReplicas; i++) {
long hash = generateHash(server + i);
ring.remove(hash);
}
}
public String getServer(String key) {
if (ring.isEmpty()) {
return null;
}
long hash = generateHash(key);
if (!ring.containsKey(hash)) {
SortedMap tailMap = ring.tailMap(hash);
hash = tailMap.isEmpty() ? ring.firstKey() : tailMap.firstKey();
}
return ring.get(hash);
}
private long generateHash(String key) {
md.reset();
md.update(key.getBytes());
byte[] digest = md.digest();
long hash = ((long) (digest[3] & 0xFF)
Подробнее здесь: [url]https://stackoverflow.com/questions/78966865/consitent-hashing-in-real-time[/url]