package com.limegroup.gnutella.util;
import java.util.Random;
/**
* A simple UUID.
*/
public final class UUID {
/**
* The characters to generate this UUID with.
*/
private static final char[] HEX = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
/**
* Index into the UUID to set its type.
*/
private static final byte INDEX_TYPE = 6;
/**
* Index into the UUID to set its variation.
*/
private static final byte INDEX_VARIATION = 8;
/**
* The specific type of the UUID.
*/
private static final byte TYPE_RANDOM_BASED = 4;
/**
* The rnd generator.
*/
private static final Random RANDOM = new Random();
/**
* The string representing this UUID.
*/
private final String uuid;
/**
* Constructs a new UUID with the specified bytes.
*/
private UUID(byte[] bytes) {
this.uuid = genString(bytes);
}
/**
* Constructs a new UUID with the specified string.
*
* The size of the string must be 32, but no other characters
* are checked.
*/
public UUID(String uuid) {
this.uuid = uuid.toLowerCase();
if(uuid.length() != 36)
throw new IllegalArgumentException();
}
/**
* Returns the next UUID.
*/
public static UUID nextUUID() {
byte[] bytes = new byte[16];
RANDOM.nextBytes(bytes);
bytes[INDEX_TYPE] &= (byte) 0x0F;
bytes[INDEX_TYPE] |= (byte) (TYPE_RANDOM_BASED << 4);
bytes[INDEX_VARIATION] &= (byte) 0x3F;
bytes[INDEX_VARIATION] |= (byte) 0x80;
return new UUID(bytes);
}
/**
* Creates the string of this UUID.
*/
private static String genString(byte[] info) {
StringBuffer sb = new StringBuffer(32);
for(int i = 0; i < 16; i++) {
if (i==4 || i==6 || i==8 || i==10)
sb.append('-');
int hex = info[i] & 0xFF;
sb.append(HEX[hex >> 4]);
sb.append(HEX[hex & 0x0F]);
}
return sb.toString();
}
/**
* Generates the string of this UUID.
*/
public String toString() {
return uuid;
}
/**
* Determines if this UUID is the same as another.
*/
public boolean equals(Object o) {
if(o == this)
return true;
else if (o instanceof UUID) {
UUID other = (UUID)o;
return uuid.equals(other.uuid);
}
return false;
}
/**
* The hashCode of this UUID.
*/
public int hashCode() {
return uuid.hashCode();
}
}