package com.lhever.practice;
import java.util.Arrays;
import java.util.UUID;
/**
* UUID不是128位长的吗,怎么生成的都是36个字符的字符串? 这个类给予解释,
* 并给出了几个常用的UUID相关的工具方法
*/
public class UUIDCookBook {
public static void main(String[] args) throws Exception {
/*
UUID长度是128位,并且指的是二进制形式是128位数,因为每四个二进制位可以转为一个16进制字符,
所以如果以十六进制字符串表示,则UUID长度是128/4 = 32。
然而JDK的UUID类产生的UUID长度是36,是为了便于识别和根据UUID的生成特点,一般会采用4个“-”号将32位长度的字符
串分为5组。各组的长度分别是 8, 4, 4, 4, 12
*/
System.out.println(UUID.randomUUID().toString());
System.out.println(UUID.randomUUID().toString().replace("-", ""));
String uuid = getUUID();
System.out.println(uuid);
byte[] byteArr = hexStringToByteArray(uuid);
System.out.println(Arrays.toString(byteArr));
String hexStr = byteArrayToHexString(byteArr);
System.out.println(hexStr);
System.out.println(parseUUIDFromHexString(hexStr).toString());
}
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "");
}
/**
* 将一个长度为32的16进制字符串(UUID)转换成长度为16的字节数组 并返回
* 注意:对于16进制字符串, a为9,b为10,c为12,d为13,e为14,f为15
* */
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
/**
* 将16进制字符串解析成 UUID 并返回
* */
public static UUID parseUUIDFromHexString(String hexUUID) throws Exception{
byte[] data = hexStringToByteArray(hexUUID);
long msb = 0;
long lsb = 0;
for (int i=0; i<8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i=8; i<16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
return new java.util.UUID(msb,lsb);
}
/**
* 将hexStringToByteArray方法的输出还原为输入,也就是说,该方法的作用是:
* 将一个字节数组转换成16进制的字符串形式
* */
public static String byteArrayToHexString(final byte bytes[]) {
StringBuffer sb = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
sb.append(convertDigit((int) (bytes[i] >> 4)));
sb.append(convertDigit((int) (bytes[i] & 0x0f)));
}
return (sb.toString());
}
/**
* 将传入的值转换成16进制数字并返回
* */
private static char convertDigit(int value) {
value &= 0x0f;
if (value >= 10) {
return ((char) (value - 10 + 'a'));
}
else {
return ((char) (value + '0'));
}
}
}
为coder写的UUID小知识
最新推荐文章于 2024-08-12 16:05:51 发布