public static void main(String[] args) {
//使用SecureRandom直接生成byte数组数据,方便调试
/*final SecureRandom ng = new SecureRandom();
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
*/
//生成后的byte数组数据
byte[] randomBytes = {-114, -94, -61, 74, 74, -56, 13, 77, -93, -120, 47, 94, 99, 101, 127, -6};
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
/*System.out.println(randomBytes[6] &= 0x0f);//十六进制0x0f转十进制后为15 ,计算后为13
System.out.println(randomBytes[6] |= 0x40);//十六进制0x40转十进制后为64,计算后为77
System.out.println(randomBytes[8] &= 0x3f);//十六进制0x3f转十进制后为63,计算后为35
System.out.println(randomBytes[8] |= 0x80);//十六进制0x80转十进制后为128,计算后为-93
*/
//最大
long msb = 0;//最后一次计算后的数据为-8168752050247021235
//最小
long lsb = 0;//最后一次计算后的数据为-6663023566253621254
assert randomBytes.length == 16 : "data must be 16 bytes in length";
//计算数组前8位
for (int i=0; i<8; i++){//randomBytes数组前8个数进行&|进行计算,数组中的最后一位数计算完成后,msb将获得最终值
msb = (msb << 8) | (randomBytes[i] & 0xff);//0xff的十进制为255
System.out.println(msb);
}
//计算数组后8位
System.out.println("========");
for (int i=8; i<16; i++){//randomBytes数组后8个数进行&|进行计算,数组中的最后一位数计算完成后,lsb将获得最终值
lsb = (lsb << 8) | (randomBytes[i] & 0xff);
System.out.println(lsb);
}
System.out.println("~~~~~~~~~");
System.out.println(msb >> 32);//msb最后一次左移为-8168752050247021235,再左移32后为-1901935798
System.out.println(digits(msb >> 32, 8) + "-" +//最大数右移32后结果为-1901935798,再计算结果为8ea2c34a
digits(msb >> 16, 4) + "-" + //最大数右移16后的计算结果为4ac8
digits(msb, 4) + "-" + //最大数不右移,直接计算结果为4d4d
digits(lsb >> 48, 4) + "-" + //最小数右移48后的计算结果为a388
digits(lsb, 12));//最小数不右移的计算结果为2f5e63657ffa,最终拼接的uuid字符串为8ea2c34a-4ac8-4d4d-a388-2f5e63657ffa
}
private static String digits(long val, int digits) {//msb右移32位后为-1901935798,8
long hi = 1L << (digits * 4);//4294967296
String hexString = Long.toHexString(hi | (val & (hi - 1)));//hi | (val & (hi - 1))后结果为6687998794
String substring = hexString.substring(1);
return substring;
}
11-27
1万+

07-23
2094
