Mega Code Archive

 
Categories / Java / Development Class
 

Your own UUID 2

//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());     } }