java UUID的长度缩减,大多数情况下可以缩减到22位
不多说,直接上代码
package test.uid;
import java.util.HashMap;
import java.util.Map;
/**
* @description: <br/>
* @package test.AA.java
* @author yang
* @date 2016年11月3日 下午3:38:34
*/
public class AA {
private static final String[] chars = { // <br>
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", // <br>
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", // <br>
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", // <br>
"u", "v", "w", "x", "y", "z", "A", "B", "C", "D", // <br>
"E", "F", "G", "H", "I", "J", "K", "L", "M", "N", // <br>
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", // <br>
"Y", "Z", "a1", "a2" // <br>
};
// 统计UUID的长度变化范围
public static void main(String[] args) throws InterruptedException {
int time = 1 * 10000 * 1000;
Map<Integer, Integer> sum = new HashMap<>();
for (int ii = 0; ii < time; ii++) {
int sbLength = uuid().length();
if (sum.get(Integer.valueOf(sbLength)) != null) {
int v = sum.get(Integer.valueOf(sbLength)).intValue();
v++;
sum.put(Integer.valueOf(sbLength), v);
} else {
sum.put(Integer.valueOf(sbLength), 1);
}
}
for (Integer in : sum.keySet()) {
System.out.println(in + ":" + sum.get(in));
}
}
// 生成UUID
public static String uuid() {
StringBuilder sb = new StringBuilder();
String uid = UUID.randomUUID().toString().replaceAll("-", "");
int length = uid.length();
// 将16进制数转换成64进制数
// 2的4次方转化成2的6次方的数据
// bcb da5 f41 172 4bc 28b 920 b1c 5f4 422 6e
// 3位转2位
int i = 0;
for (; i < length; i = i + 3) {
// 16进制数转化成10进制数
int end = i + 3;
if (end >= length) {
end = length;
}
int t = Integer.parseInt(uid.substring(i, end), 16);
// 10进制数转化成64进制数
sb.append(chars[t % 64]);// 第二个数据
sb.append(chars[t / 64]);// 第一个数据
}
return sb.toString();
}
}
运行结果:
这是运行一千万次的统计结果,可以看出,绝大多数数的情况下长度控制在了22,23,24,长度超过30的,几乎没有。
22:5128484
23:3485544
24:1121942
25:227826
26:32459
27:3434
28:291
29:20
22:5131172
23:3481856
24:1122781
25:227813
26:32572
27:3480
28:311
29:14
30:1
22:5125815
23:3489413
24:1121142
25:227271
26:32491
27:3562
28:283
29:22
30:1
数学公式
使用MathJax渲染LaTex 数学公式,