private void updateHash(MemcachedReplicaGroup group, boolean remove) { // Ketama does some special work with md5 where it reuses chunks. for (int i = 0; i < config.getNodeRepetitions() / 4; i++) { byte[] digest = HashAlgorithm.computeMd5(config.getKeyForGroup(group, 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); if (remove) ketamaGroups.remove(k); else ketamaGroups.put(k, group); } } }
byte[] bKey=computeMd5(k); rv = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16)
byte[] bKey=computeMd5(k); rv = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16)
byte[] bKey = computeMd5(k); rv = ((long) (bKey[3] & 0xFF) << 24) | ((long) (bKey[2] & 0xFF) << 16)
public KetamaNodeLocator(List<MemcachedNode> nodes, HashAlgorithm alg, KetamaNodeLocatorConfiguration conf) { super(); allNodes = nodes; hashAlg = alg; ketamaNodes = new TreeMap<Long, MemcachedNode>(); config = conf; int numReps = config.getNodeRepetitions(); for (MemcachedNode node : nodes) { // Ketama does some special work with md5 where it reuses chunks. if (alg == HashAlgorithm.KETAMA_HASH) { for (int i = 0; i < numReps / 4; i++) { byte[] digest = HashAlgorithm.computeMd5(config.getKeyForNode(node, 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); ketamaNodes.put(k, node); } } } else { for (int i = 0; i < numReps; i++) { ketamaNodes.put(hashAlg.hash(config.getKeyForNode(node, i)), node); } } } assert ketamaNodes.size() == numReps * nodes.size(); }
public KetamaNodeLocator(List<MemcachedNode> nodes, HashAlgorithm alg, KetamaNodeLocatorConfiguration conf) { super(); allNodes = nodes; hashAlg = alg; ketamaNodes=new TreeMap<Long, MemcachedNode>(); config= conf; int numReps= config.getNodeRepetitions(); for(MemcachedNode node : nodes) { // Ketama does some special work with md5 where it reuses chunks. if(alg == HashAlgorithm.KETAMA_HASH) { for(int i=0; i<numReps / 4; i++) { byte[] digest=HashAlgorithm.computeMd5(config.getKeyForNode(node, 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); ketamaNodes.put(k, node); } } } else { for(int i=0; i<numReps; i++) { ketamaNodes.put(hashAlg.hash(config.getKeyForNode(node, i)), node); } } } assert ketamaNodes.size() == numReps * nodes.size(); }
private void updateHash(MemcachedNode node, boolean remove) { if (!remove) { config.insertNode(node); } // Ketama does some special work with md5 where it reuses chunks. for (int i = 0; i < config.getNodeRepetitions() / 4; i++) { byte[] digest = HashAlgorithm.computeMd5(config.getKeyForNode(node, 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); if (remove) { ketamaNodes.remove(k); } else { ketamaNodes.put(k, node); } } } if (remove) { config.removeNode(node); } }
byte[] digest=HashAlgorithm.computeMd5(config.getKeyForNode(node, i)); for(int h=0;h<4;h++) { Long k = ((long)(digest[3+h*4]&0xFF) << 24)