/**
  * Construct a new ketamaRouter
  *
  * @param redisClientMap key is redis client, value is weight, must > 0.
  */
 public KetamaRouter(Map<RedisClient, Integer> redisClientMap) {
   this.redisClientMap = redisClientMap;
   ketamaClients = new TreeMap<Long, List<RedisClient>>();
   // build ke
   for (RedisClient client : redisClientMap.keySet()) {
     String hashKey = client.hashKey();
     int numReps = NUM_REPS * redisClientMap.get(client);
     for (int i = 0; i < numReps / 4; i++) {
       byte[] digest = HashAlgorithm.computeMd5(hashKey + "-" + i);
       for (int h = 0; h < 4; h++) {
         long k =
             (long) (digest[3 + h * 4] & 0xFF) << 24
                 | (long) (digest[2 + h * 4] & 0xFF) << 16
                 | (long) (digest[1 + h * 4] & 0xFF) << 8
                 | digest[h * 4] & 0xFF;
         this.getClientList(ketamaClients, k).add(client);
       }
     }
   }
 }