package com.revolsys.util;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import com.revolsys.datatype.DataTypes;
public class Uuid {
// use sha1 instead
public static final UUID md5(final String namespace, final byte[] name) {
return name(3, namespace, name);
}
// use sha1 instead
public static final UUID md5(final String namespace, final Object name) {
return name(3, namespace, name);
}
// use sha1 instead
public static final UUID md5(final String namespace, final String name) {
return name(3, namespace, name);
}
private static UUID name(final int type, final String namespace, final byte[] name) {
try {
final MessageDigest digester;
if (type == 3) {
digester = MessageDigest.getInstance("MD5");
} else if (type == 5) {
digester = MessageDigest.getInstance("SHA-1");
} else {
throw new IllegalArgumentException("Unknown namespace UUID type " + type);
}
if (namespace != null) {
final byte[] bytes = namespace.getBytes(StandardCharsets.UTF_8);
digester.update(bytes);
}
if (name != null) {
digester.update(name);
}
final byte[] digest = digester.digest();
return Uuid.toUuid(type, digest);
} catch (final NoSuchAlgorithmException e) {
return Exceptions.throwUncheckedException(e);
}
}
private static UUID name(final int type, final String namespace, final Object name) {
try {
final MessageDigest digester;
if (type == 3) {
digester = MessageDigest.getInstance("MD5");
} else if (type == 5) {
digester = MessageDigest.getInstance("SHA-1");
} else {
throw new IllegalArgumentException("Unknown namespace UUID type " + type);
}
if (namespace != null) {
final byte[] bytes = namespace.getBytes(StandardCharsets.UTF_8);
digester.update(bytes);
}
if (name instanceof String) {
final byte[] bytes = ((String)name).getBytes(StandardCharsets.UTF_8);
digester.update(bytes);
} else if (name != null) {
final String string = DataTypes.toString(name);
final byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
digester.update(bytes);
}
final byte[] digest = digester.digest();
return Uuid.toUuid(type, digest);
} catch (final NoSuchAlgorithmException e) {
return Exceptions.throwUncheckedException(e);
}
}
public static final UUID sha1(final String namespace, final byte[] name) {
return name(5, namespace, name);
}
public static final UUID sha1(final String namespace, final Object name) {
return name(5, namespace, name);
}
public static final UUID sha1(final String namespace, final String name) {
return name(5, namespace, name);
}
public static UUID toUuid(final byte[] bytes) {
final long l1 = MathUtil.toLong(bytes, 0);
final long l2 = MathUtil.toLong(bytes, 8);
return new UUID(l1, l2);
}
public static UUID toUuid(final int type, final byte[] bytes) {
bytes[6] &= 0x0f; // clear version
bytes[6] |= type << 4; // set to version
bytes[8] &= 0x3f; // clear variant
bytes[8] |= 0x80; // set to IETF variant
return toUuid(bytes);
}
}