docs: protected final void setKetamaNodes(List<MemcachedNode> nodes) {
          TreeMap<Long, MemcachedNode> newNodeMap = new TreeMap<Long, MemcachedNode>();
          final int numReps = config.getNodeRepetitions();
          for (MemcachedNode node : nodes) {
              // Ketama does some special work with md5 where it reuses chunks.
              if (hashingAlgorithm == DefaultHashAlgorithm.KETAMA_HASH) {
                  for (int i = 0; i < numReps / 4; i++) {
                  	final String hashString = config.getKeyForNode(node, i);
                      byte[] digest = DefaultHashAlgorithm.computeMd5(hashString);
                      if (log.isDebugEnabled()) log.debug("digest : " + digest);
                      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);
                          newNodeMap.put(Long.valueOf(k), node);
                          if (log.isDebugEnabled()) log.debug("Key : " + hashString + " ; hash : " + k + "; node " + node );
                      }
                  }
              } else {
                  for (int i = 0; i < numReps; i++) {
                      final Long hashL = Long.valueOf(hashingAlgorithm.hash(config.getKeyForNode(node, i)));
                      newNodeMap.put(hashL, node);
                  }
              }
          }
          if (log.isDebugEnabled()) log.debug("NewNodeMapSize : " + newNodeMap.size() + "; MapSize : " + (numReps * nodes.size()));
          if (log.isTraceEnabled()) {
              for (Long key : newNodeMap.keySet()) {
                  log.trace("Hash : " + key + "; Node : " + newNodeMap.get(key));
              }
          }
          ketamaNodes = newNodeMap;
      }