Author: gdusbabek
Date: Thu Mar  4 20:17:04 2010
New Revision: 919154

URL: http://svn.apache.org/viewvc?rev=919154&view=rev
Log:
CASSANDRA-825 use jug for TimeUUID generation

Added:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
    
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
Modified:
    incubator/cassandra/trunk/ivy.xml

Modified: incubator/cassandra/trunk/ivy.xml
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/ivy.xml?rev=919154&r1=919153&r2=919154&view=diff
==============================================================================
--- incubator/cassandra/trunk/ivy.xml (original)
+++ incubator/cassandra/trunk/ivy.xml Thu Mar  4 20:17:04 2010
@@ -47,6 +47,12 @@
 
     <dependency org="org.apache.rat" name="apache-rat" rev="0.6"
                 conf="qa->default"/>
+    <dependency org="org.mortbay.jetty" name="jetty" rev="6.1.21"/>
+
+       <dependency org="org.safehaus.jug" name="jug" rev="2.0.0"> 
+      <!-- I can't figure out how to tell ivy to grab the classifier=asl 
version of this lib, so I force it. -->
+         <artifact name="jug" type="jar" ext="jar" 
url="http://repo1.maven.org/maven2/org/safehaus/jug/jug/2.0.0/jug-2.0.0-asl.jar"/>
+       </dependency>
   </dependencies>
 </ivy-module>
 

Added: 
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java?rev=919154&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java 
(added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/UUIDGen.java 
Thu Mar  4 20:17:04 2010
@@ -0,0 +1,62 @@
+package org.apache.cassandra.utils;
+
+import org.safehaus.uuid.EthernetAddress;
+import org.safehaus.uuid.UUIDGenerator;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * Generates type 1 (time-based) UUIDs
+ */
+public class UUIDGen
+{
+    /** creates a type1 uuid but substitutes hash of the IP where the mac 
would go. */
+    public static synchronized UUID makeType1UUIDFromHost(InetAddress addr)
+    {
+        try
+        {
+            MessageDigest digest = MessageDigest.getInstance("MD5");
+            digest.update(addr.getAddress());
+            byte[] md5 = digest.digest();
+            byte[] fauxMac = new byte[6];
+            System.arraycopy(md5, 0, fauxMac, 0, Math.min(md5.length, 
fauxMac.length));
+            return 
makeType1UUID(UUIDGenerator.getInstance().generateTimeBasedUUID(new 
EthernetAddress(fauxMac)).toByteArray());
+        }
+        catch (NoSuchAlgorithmException ex)
+        {
+            throw new RuntimeException("Your platform has no support for 
generating MD5 sums");
+        }
+    }
+
+    /** creates a type 1 uuid from raw bytes. */
+    static UUID makeType1UUID(byte[] raw)
+    {
+        long most = 0;
+        long least = 0;
+        assert raw.length == 16;
+        for (int i = 0; i < 8; i++)
+            most = (most << 8) | (raw[i] & 0xff);
+        for (int i =8 ; i < 16; i++)
+            least = (least << 8) | (raw[i] & 0xff);
+        return new UUID(most, least);
+    }
+
+    /** decomposes a uuid into raw bytes. */
+    static byte[] decompose(UUID uuid)
+    {
+        long most = uuid.getMostSignificantBits();
+        long least = uuid.getLeastSignificantBits();
+        byte[] b = new byte[16];
+        for (int i = 0; i < 8; i++)
+        {
+            b[i] = (byte)(most >>> ((7-i) * 8));
+            b[8+i] = (byte)(least >>> ((7-i) * 8));
+        }
+        return b;
+    }
+}

Added: 
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java
URL: 
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java?rev=919154&view=auto
==============================================================================
--- 
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java 
(added)
+++ 
incubator/cassandra/trunk/test/unit/org/apache/cassandra/utils/UUIDTests.java 
Thu Mar  4 20:17:04 2010
@@ -0,0 +1,56 @@
+package org.apache.cassandra.utils;
+
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.junit.Test;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.UUID;
+
+
+public class UUIDTests
+{
+    @Test
+    public void verifyType1() throws UnknownHostException
+    {
+        
+        UUID uuid = 
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+        assert uuid.version() == 1;
+    }
+
+    @Test
+    public void verifyOrdering1() throws UnknownHostException
+    {
+        UUID one = 
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+        UUID two = 
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.2"));
+        assert one.timestamp() < two.timestamp();
+    }
+
+
+    @Test
+    public void testDecomposeAndRaw() throws UnknownHostException
+    {
+        UUID a = 
UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1"));
+        byte[] decomposed = UUIDGen.decompose(a);
+        UUID b = UUIDGen.makeType1UUID(decomposed);
+        assert a.equals(b);
+    }
+
+    @Test
+    public void testTimeUUIDType() throws UnknownHostException
+    {
+        TimeUUIDType comp = new TimeUUIDType();
+        byte[] first = 
UUIDGen.decompose(UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1")));
+        byte[] second = 
UUIDGen.decompose(UUIDGen.makeType1UUIDFromHost(InetAddress.getByName("127.0.0.1")));
+        assert comp.compare(first, second) < 0;
+        assert comp.compare(second, first) > 0;
+        byte[] sameAsFirst = UUIDGen.decompose(UUIDGen.makeType1UUID(first));
+        assert comp.compare(first, sameAsFirst) == 0;
+    }
+
+    private void assertNonZero(BigInteger i)
+    {
+        assert i.toString(2).indexOf("1") > -1;
+    }
+}


Reply via email to