diff --git a/src/java/org/apache/cassandra/dht/RandomPartitioner.java b/src/java/org/apache/cassandra/dht/RandomPartitioner.java index 367137bc4d..cb41925c1b 100644 --- a/src/java/org/apache/cassandra/dht/RandomPartitioner.java +++ b/src/java/org/apache/cassandra/dht/RandomPartitioner.java @@ -80,7 +80,7 @@ public class RandomPartitioner implements IPartitioner public BigIntegerToken getRandomToken() { - BigInteger token = FBUtilities.md5hash(GuidGenerator.guidAsBytes()); + BigInteger token = FBUtilities.hashToBigInteger(GuidGenerator.guidAsBytes()); if ( token.signum() == -1 ) token = token.multiply(BigInteger.valueOf(-1L)); return new BigIntegerToken(token); @@ -126,7 +126,7 @@ public class RandomPartitioner implements IPartitioner { if (key.remaining() == 0) return MINIMUM; - return new BigIntegerToken(FBUtilities.md5hash(key)); + return new BigIntegerToken(FBUtilities.hashToBigInteger(key)); } public Map describeOwnership(List sortedTokens) diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 2460aa0da6..dc8faac709 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -28,6 +28,7 @@ import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -64,6 +65,22 @@ public class FBUtilities private static volatile InetAddress localInetAddress_; + private static final ThreadLocal localMessageDigest = new ThreadLocal() + { + @Override + protected MessageDigest initialValue() + { + try + { + return MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException e) + { + throw new AssertionError(e); + } + } + }; + public static final int MAX_UNSIGNED_SHORT = 0xFFFF; /** @@ -218,19 +235,20 @@ public class FBUtilities return out; } - public static BigInteger md5hash(ByteBuffer data) + public static BigInteger hashToBigInteger(ByteBuffer data) { - byte[] result = hash("MD5", data); + byte[] result = hash(data); BigInteger hash = new BigInteger(result); return hash.abs(); } - public static byte[] hash(String type, ByteBuffer... data) + public static byte[] hash(ByteBuffer... data) { byte[] result; try { - MessageDigest messageDigest = MessageDigest.getInstance(type); + MessageDigest messageDigest = localMessageDigest.get(); + messageDigest.reset(); for(ByteBuffer block : data) messageDigest.update(block.array(),block.position()+block.arrayOffset(),block.remaining()); result = messageDigest.digest();