UUID 是通用唯一识别码(Universally Unique Identifier)的缩写,是一个128比特的数值。UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的,它保证对在同一时空中的所有机器都是唯一的。
Java中UUID类可以方便地获取UUID:
- fromString:从标准字符串格式中获取UUID;
- randomUUID:生成一个随机的UUID;
- nameUUIDFromBytes:根据指定的字节数组获取一个类型3(基于名称)的UUID;
- getLeastSignificantBits:获取低64bit部分的UUID;
- getMostSignificantBits:获取高64bit部分的UUID;
常见的UUID是36字符编码的,为了更方便使用且缩写空间占用,可通过Base64编码压缩为22字符(只含字符、数字和下划线、中划线),此种编码可以方便地用于数据库、URL等中。
为了保证只含字符、数字和下划线、中划线,需要使用UrlEncoder:
public class UUIDHelper {
static final Base64.Encoder _Base64Encoder = Base64.getUrlEncoder().withoutPadding();
public static byte[] uuid2Bytes(UUID uuid) {
ByteBuffer buff = ByteBuffer.wrap(new byte[16]);
buff.putLong(uuid.getMostSignificantBits());
buff.putLong(uuid.getLeastSignificantBits());
return buff.array();
}
public static String uuid2Base64(UUID uuid) {
byte[] byUuid = uuid2Bytes(uuid);
return _Base64Encoder.encodeToString(byUuid);
}
public static String getBase64Uuid() {
UUID uuid = UUID.randomUUID();
return uuid2Base64(uuid);
}
public static UUID base642UUID(String strBase64) {
byte[] byUuid = Base64.getUrlDecoder().decode(strBase64);
ByteBuffer buff = ByteBuffer.wrap(byUuid);
long mostSigBits = buff.getLong();
long leastSigBits = buff.getLong();
return new UUID(mostSigBits, leastSigBits);
}
}