package uk.ac.imperial.lsds.seepworker.core.output.routing; import java.util.ArrayList; import java.util.List; import java.util.zip.CRC32; public class ConsistentHashingRoutingState implements Router { private CRC32 crc32; // each downstream id private List<Integer> opIds; // subspace per downstream id private List<Integer> subspaceFrontiers; public ConsistentHashingRoutingState(List<Integer> opIds){ this.crc32 = new CRC32(); this.opIds = opIds; this.subspaceFrontiers = new ArrayList<>(); int numSpaces = opIds.size(); // calculate span of each subrange of the space long entireSpace = (long)Integer.MAX_VALUE * 2; long initialSubspaceSize = (numSpaces > 0) ? entireSpace/numSpaces : entireSpace; int frontier = Integer.MAX_VALUE; for(int i = 0; i < numSpaces; i++){ subspaceFrontiers.add(frontier); frontier -= initialSubspaceSize; } } @Override public int route(int key) { int hashedKey = hashKey(key); int subspaceFrontiersSize = subspaceFrontiers.size(); for(int i = subspaceFrontiersSize-1; i >= 0; i--){ int frontier = subspaceFrontiers.get(i); if(hashedKey <= frontier){ return opIds.get(i); } } return -1; } private int hashKey(int value){ crc32.update(value); int v = (int)crc32.getValue(); crc32.reset(); return v; } private int hashKey(String value){ int v = value.hashCode(); return hashKey(v); } @Override public int route() { // TODO Auto-generated method stub return -1; } }