Java tutorial
//package jatools.util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; /** * DOCUMENT ME! * * @author $author$ * @version $Revision: 1.1 $ */ public final class UUID implements Serializable, Comparable { private static final long serialVersionUID = 0xbc9903f7986d852fL; private static volatile SecureRandom numberGenerator = null; private final long mostSigBits; private final long leastSigBits; private transient int version; private transient int variant; private volatile transient long timestamp; private transient int sequence; private transient long node; private transient int hashCode; private UUID(byte[] abyte0) { version = -1; variant = -1; timestamp = -1L; sequence = -1; node = -1L; hashCode = -1; long l = 0L; long l1 = 0L; for (int i = 0; i < 8; i++) l = (l << 8) | (long) (abyte0[i] & 0xff); for (int j = 8; j < 16; j++) l1 = (l1 << 8) | (long) (abyte0[j] & 0xff); mostSigBits = l; leastSigBits = l1; } /** * Creates a new UUID object. * * @param l DOCUMENT ME! * @param l1 DOCUMENT ME! */ public UUID(long l, long l1) { version = -1; variant = -1; timestamp = -1L; sequence = -1; node = -1L; hashCode = -1; mostSigBits = l; leastSigBits = l1; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static UUID randomUUID() { SecureRandom securerandom = numberGenerator; if (securerandom == null) { numberGenerator = securerandom = new SecureRandom(); } byte[] abyte0 = new byte[16]; securerandom.nextBytes(abyte0); abyte0[6] &= 0xf; abyte0[6] |= 0x40; abyte0[8] &= 0x3f; abyte0[8] |= 0x80; UUID uuid = new UUID(abyte0); return new UUID(abyte0); } public static String newInstance() { return randomUUID().toString(); } /** * DOCUMENT ME! * * @param abyte0 DOCUMENT ME! * * @return DOCUMENT ME! */ public static UUID nameUUIDFromBytes(byte[] abyte0) { MessageDigest messagedigest; try { messagedigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException nosuchalgorithmexception) { throw new InternalError("MD5 not supported"); } byte[] abyte1 = messagedigest.digest(abyte0); abyte1[6] &= 0xf; abyte1[6] |= 0x30; abyte1[8] &= 0x3f; abyte1[8] |= 0x80; return new UUID(abyte1); } /** * DOCUMENT ME! * * @param s DOCUMENT ME! * * @return DOCUMENT ME! */ public static UUID fromString(String s) { String[] as = s.split("-"); if (as.length != 5) { throw new IllegalArgumentException( (new StringBuffer()).append("Invalid UUID string: ").append(s).toString()); } for (int i = 0; i < 5; i++) as[i] = (new StringBuffer()).append("0x").append(as[i]).toString(); long l = Long.decode(as[0]).longValue(); l <<= 16; l |= Long.decode(as[1]).longValue(); l <<= 16; l |= Long.decode(as[2]).longValue(); long l1 = Long.decode(as[3]).longValue(); l1 <<= 48; l1 |= Long.decode(as[4]).longValue(); return new UUID(l, l1); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public long getLeastSignificantBits() { return leastSigBits; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public long getMostSignificantBits() { return mostSigBits; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int version() { if (version < 0) { version = (int) ((mostSigBits >> 12) & 15L); } return version; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int variant() { if (variant < 0) { if (leastSigBits >>> 63 == 0L) { variant = 0; } else if (leastSigBits >>> 62 == 2L) { variant = 2; } else { variant = (int) (leastSigBits >>> 61); } } return variant; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public long timestamp() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } long l = timestamp; if (l < 0L) { l = (mostSigBits & 4095L) << 48; l |= (((mostSigBits >> 16) & 65535L) << 32); l |= mostSigBits >>> 32; timestamp = l; } return l; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int clockSequence() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } if (sequence < 0) { sequence = (int) ((leastSigBits & 0x3fff000000000000L) >>> 48); } return sequence; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public long node() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } if (node < 0L) { node = leastSigBits & 0xffffffffffffL; } return node; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String toString() { return (new StringBuffer()).append(digits(mostSigBits >> 32, 8)).append("-") .append(digits(mostSigBits >> 16, 4)).append("-").append(digits(mostSigBits, 4)).append("-") .append(digits(leastSigBits >> 48, 4)).append("-").append(digits(leastSigBits, 12)).toString(); } private static String digits(long l, int i) { long l1 = 1L << (i * 4); return Long.toHexString(l1 | (l & (l1 - 1L))).substring(1); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int hashCode() { if (hashCode == -1) { hashCode = (int) ((mostSigBits >> 32) ^ mostSigBits ^ (leastSigBits >> 32) ^ leastSigBits); } return hashCode; } /** * DOCUMENT ME! * * @param obj DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean equals(Object obj) { if (!(obj instanceof UUID)) { return false; } if (((UUID) obj).variant() != variant()) { return false; } else { UUID uuid = (UUID) obj; return (mostSigBits == uuid.mostSigBits) && (leastSigBits == uuid.leastSigBits); } } /** * DOCUMENT ME! * * @param uuid DOCUMENT ME! * * @return DOCUMENT ME! */ public int compareTo(UUID uuid) { return (mostSigBits >= uuid.mostSigBits) ? ((mostSigBits <= uuid.mostSigBits) ? ((leastSigBits >= uuid.leastSigBits) ? ((byte) (((byte) ((leastSigBits <= uuid.leastSigBits) ? 0 : 1)))) : (-1)) : 1) : (-1); } private void readObject(ObjectInputStream objectinputstream) throws IOException, ClassNotFoundException { objectinputstream.defaultReadObject(); version = -1; variant = -1; timestamp = -1L; sequence = -1; node = -1L; hashCode = -1; } /** * DOCUMENT ME! * * @param obj DOCUMENT ME! * * @return DOCUMENT ME! */ public int compareTo(Object obj) { return compareTo((UUID) obj); } /** * DOCUMENT ME! * * @param args DOCUMENT ME! */ public static void main(String[] args) { System.out.println(randomUUID()); } }