rwinston 2004/12/14 04:39:59
Modified: id project.xml
id/src/java/org/apache/commons/id/uuid Constants.java
UUID.java
id/src/test/org/apache/commons/id/uuid UUIDTest.java
id/xdocs index.xml uuid.xml
Log:
Added support for UUID generation as specified in the latest UUID draft
(http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-04.txt). The only
difference is support for SHA-1 encoding when generating UUIDs from a name and
namespace.
Revision Changes Path
1.11 +6 -0 jakarta-commons-sandbox/id/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/id/project.xml,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- project.xml 22 Jul 2004 19:31:16 -0000 1.10
+++ project.xml 14 Dec 2004 12:39:58 -0000 1.11
@@ -69,6 +69,12 @@
</developers>
<contributors>
+ <contributor>
+ <name>Rory Winston</name>
+ <id>rwinston</id>
+ <email>[EMAIL PROTECTED]</email>
+ <organization></organization>
+ </contributor>
</contributors>
<dependencies>
1.3 +11 -1
jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/Constants.java
Index: Constants.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/Constants.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Constants.java 14 Jun 2004 12:45:30 -0000 1.2
+++ Constants.java 14 Dec 2004 12:39:59 -0000 1.3
@@ -92,6 +92,16 @@
/** Version four constant for UUID version four of four */
int VERSION_FOUR = 4;
+ /** Version five constant for UUID version five - identical to version 3
*/
+ int VERSION_FIVE = 3;
+
+ /** Constants that correspond to the encoding being used, a la
+ * http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-04.txt.
+ * Current legal values are "MD5" and "SHA1"
+ */
+ String MD5_ENCODING = "MD5";
+ String SHA1_ENCODING = "SHA1";
+
//** Exception message constants
/** Message indicating this is not a version one UUID */
String WRONG_VAR_VER_MSG = "Not a ietf variant 2 or version 1
(time-based UUID)";
1.10 +40 -6
jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/UUID.java
Index: UUID.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/id/src/java/org/apache/commons/id/uuid/UUID.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- UUID.java 22 Jul 2004 20:03:25 -0000 1.9
+++ UUID.java 14 Dec 2004 12:39:59 -0000 1.10
@@ -287,8 +287,9 @@
* <ul>
* <li>VERSION_ONE - The time-based version</li>
* <li>VERSION_TWO - DCE Security version, with embedded POSIX
UIDs.</li>
- * <li>VERSION_THREE - Name based UUID.</li>
+ * <li>VERSION_THREE - Name based UUID with MD5 hashing.</li>
* <li>VERSION_FOUR - Random based UUID.</li>
+ * <li>VERSION_FIVE - Name based UUID with SHA-1 hashing.</li>
* </ul>
* </p>
* @return the version of the UUID.
@@ -419,25 +420,58 @@
}
/**
- * <p>Returns a new version three UUID given a name and the namespace's
UUID.</p>
+ * <p>Returns a new version three (MD5) or five (SHA-1) UUID, using the
specified encoding
+ * given a name and the namespace's UUID.</p>
*
* @param name String the name to calculate the UUID for.
* @param namespace UUID assigned to this namespace.
+ * @param encoding The encoding to use, either #{link UUID.MD5_ENCODING}
or #{link UUID.SHA1_ENCODING}
* @return a new version three UUID given a name and the namespace's
UUID.
*/
- static UUID nameUUIDFromString(String name, UUID namespace) {
+ static UUID nameUUIDFromString(String name, UUID namespace, String
encoding) {
byte[] nameAsBytes = name.getBytes();
byte[] concat = new byte[UUID_BYTE_LENGTH + nameAsBytes.length];
System.arraycopy(namespace.getRawBytes(), 0, concat, 0,
UUID_BYTE_LENGTH);
System.arraycopy(nameAsBytes, 0, concat, UUID_BYTE_LENGTH,
nameAsBytes.length);
- byte[] raw = DigestUtils.md5(concat);
- //Set version
+
+ byte[] raw = null;
+
+ if(encoding.equals(UUID.MD5_ENCODING)) {
+ raw = DigestUtils.md5(concat);
+ }
+ else if(encoding.equals(UUID.SHA1_ENCODING)) {
+ byte[] shaDigest = DigestUtils.sha(concat);
+ // Truncate digest to 16 bytes (SHA-1 returns a 20-byte digest)
+ raw = new byte[16];
+ System.arraycopy(shaDigest, 0, raw, 0, 16);
+ }
+ else {
+ throw new RuntimeException("Unsupported encoding " + encoding);
+ }
+
+
+ //Set version (version 3 and version 5 are identical on a bit-level,
+ //thus we only need ever set one of them
raw[TIME_HI_AND_VERSION_BYTE_6] &= 0x0F;
raw[TIME_HI_AND_VERSION_BYTE_6] |= (UUID.VERSION_THREE << 4);
+
//Set variant
raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] &= 0x3F; //0011 1111
raw[CLOCK_SEQ_HI_AND_RESERVED_BYTE_8] |= 0x80; //1000 0000
return new UUID(raw);
}
+
+ /**
+ * <p>Returns a new version three UUID given a name and the namespace's
UUID.</p>
+ *
+ * @param name String the name to calculate the UUID for.
+ * @param namespace UUID assigned to this namespace.
+ * @return a new version three UUID given a name and the namespace's
UUID.
+ *
+ */
+ static UUID nameUUIDFromString(String name, UUID namespace) {
+ return nameUUIDFromString(name, namespace, UUID.MD5_ENCODING);
+ }
+
}
1.7 +32 -1
jakarta-commons-sandbox/id/src/test/org/apache/commons/id/uuid/UUIDTest.java
Index: UUIDTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/id/src/test/org/apache/commons/id/uuid/UUIDTest.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- UUIDTest.java 14 Jun 2004 12:54:36 -0000 1.6
+++ UUIDTest.java 14 Dec 2004 12:39:59 -0000 1.7
@@ -331,6 +331,35 @@
assertEquals("3d813cbb-47fb-32ba-91df-831e1593ac29", known.toString());
}
+ /**
+ * Test the static #{link UUID.nameUUIDFromString} method, with explicit
SHA-1 encoding
+ * as specified in version 4 of the UUID draft.
+ */
+ public void testNameUUIDFromStringSha1() throws Exception {
+ //UUID assigned to URL Namespace
+ UUID ns = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
+ //UUID assigned to ISO OID
+ UUID nsAlt = UUID.fromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8");
+
+ String name = "www.apache.org";
+ String nameAlt = "cvs.apache.org";
+ UUID test1 = UUID.nameUUIDFromString(name, ns, UUID.SHA1_ENCODING);
+
+ assertEquals(Constants.VARIANT_IETF_DRAFT, test1.variant());
+ assertEquals(Constants.VERSION_FIVE, test1.version());
+
+ //Assert not same - same name from different namespace
+ UUID test2 = UUID.nameUUIDFromString(name, nsAlt, UUID.SHA1_ENCODING);
+ assertTrue(!test2.equals(test1));
+ //Assert not same - same namespace different names
+ UUID test3 = UUID.nameUUIDFromString(nameAlt, ns, UUID.SHA1_ENCODING);
+ assertTrue(!test3.equals(test1));
+ //Assert equals different UUID instance from same name, namespace
+ UUID test4 = UUID.nameUUIDFromString(name, ns, UUID.SHA1_ENCODING);
+ assertTrue(test4.equals(test1));
+
+ }
+
/**
* Test the toString of UUID
@@ -393,10 +422,12 @@
UUID v2 = new UUID("3051a8d7-aea7-2801-e0bf-bc539dd60cf3");
//Version two 0x28 = 0010 1000
UUID v3 = new UUID("3051a8d7-aea7-3801-e0bf-bc539dd60cf3");
//Version three 0x38 = 0011 1000
UUID v4 = new UUID("3051a8d7-aea7-4801-e0bf-bc539dd60cf3");
//Version four 0x48 = 0100 1000
+ UUID v5 = new UUID("3051a8d7-aea7-3801-e0bf-bc539dd60cf3"); //Version
five 0x38 = 0011 1000
assertEquals(UUID.VERSION_ONE, v1.version());
assertEquals(UUID.VERSION_TWO, v2.version());
assertEquals(UUID.VERSION_THREE, v3.version());
assertEquals(UUID.VERSION_FOUR, v4.version());
+ assertEquals(UUID.VERSION_FIVE, v5.version());
}
/**
1.6 +2 -2 jakarta-commons-sandbox/id/xdocs/index.xml
Index: index.xml
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/id/xdocs/index.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- index.xml 31 May 2004 06:37:43 -0000 1.5
+++ index.xml 14 Dec 2004 12:39:59 -0000 1.6
@@ -81,7 +81,7 @@
time period.</td></tr>
<tr><td>
<a href="uuid.html">UUID Generators</a></td><td>Generates universally
Unique Identifiers
- based on the <a
href="http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-03.txt">
+ based on the <a
href="http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-04.txt">
IETF Draft Uuid Specification.</a>
</td></tr>
</table>
1.3 +12 -2 jakarta-commons-sandbox/id/xdocs/uuid.xml
Index: uuid.xml
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/id/xdocs/uuid.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- uuid.xml 31 May 2004 06:37:59 -0000 1.2
+++ uuid.xml 14 Dec 2004 12:39:59 -0000 1.3
@@ -25,8 +25,8 @@
<section name="Overview">
<p>
A Universally Unique Identifier (UUID) is a 128-bit identifier described
in the
- <a
href="http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-03.txt">IETF
Draft Uuid Specification</a>.
- Generators for version 1 and version 4 UUID's are provided. The value
held in a UUID is represented
+ <a
href="http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-04.txt">IETF
Draft Uuid Specification</a>.
+ Generators for versions 1,3,4 and 5 UUID's are provided. The value
held in a UUID is represented
by a specific hexadecimal format of the binary fields. An example UUID
string representation is:
F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6. A cautionary note: there is no
standard regarding binary
representation of a UUID other than its string format.
@@ -37,6 +37,16 @@
The version 4 UUID is UUID based on random bytes. We fill the 128-bits
with random bits (6 of the
bits are correspondingly set to flag the version and variant of the UUID).
No special configuration
or implementation decisions are required to generate version 4 UUID's.
+</p>
+</section>
+<section name="UUID version 3">
+<p>
+ Version 3 UUIDs are initialized using a name, a namespace, and the MD5
hashing algorithm.
+</p>
+</section>
+<section name="UUID version 5">
+ <p>
+ Version 5 UUIDs are initialized using a name, a namespace, and
the SHA-1 hashing algorithm.
</p>
</section>
<section name="UUID version 1">
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]