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