在日常的项目开发中,我们经常会遇到需要生成唯一ID的业务场景,不同的业务对唯一ID的生成方式与要求都会不尽相同,一是生成方式多种多样,如UUID、雪花算法、数据库递增等;其次业务要求上也各有不同,有的只要保证唯一性即可,有的需要加上时间戳,有的要保证按顺序递增等。以下是我结合实际业务中的使用总结了几种唯一ID的生成方式, 要求就是在一般的应用场景下一方面能满足一定数据量级(千万级)的需要,另一方面使用方式相对简单轻量,不需要过多依赖第三方,同时从并发安全、冲突率、生成性能上做了一些简单的测试,大家可以略做参考
一、生成方式
1、UUID产生命令唯一标识,32位的字母数字组合
/**
* 根据UUID产生命令唯一标识
*
* @throws InterruptedException
*/
public static String getUUIDHashCode() {
String orderSeq = UUID.randomUUID().toString();
return orderSeq;
}
2、UUID取hash值+随机数,16位纯数字
/**
* 根据UUID取hash值+随机数,产生命令唯一标识
*
* @throws InterruptedException
*/
public static String getOrderSeq() {
String orderSeq = Math.abs(UUID.randomUUID().toString().hashCode()) + "";
while (orderSeq.length() < 16) {
orderSeq = orderSeq + (int) (Math.random() * 10);
}
return orderSeq;
}
3、十六进制随机数 ,长度16的十六进制字符串
//十六进制随机数 16位的十六进制字符串
public static String getRandomHexString() {
try {
StringBuffer result = new StringBuffer();
for (int i = 0; i < 16; i++) {
result.append(Integer.toHexString(new Random().nextInt(16)));
}
return result.toString().toUpperCase();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
4、雪花算法
长度不超过20的纯数字,时间戳不同,长度会产生变化
/** 开始时间戳 */
private final long twepoch = 1420041600000L;
/** 机器id所占的位数 */
private final long workerIdBits = 5L;
/** 数据标识id所占的位数 */
private final long datacenterIdBits = 5L;
/** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
private final long maxWorkerId = -1L ^ (-1L |