ID生成
线上已使用4年,ID没有出现重复过
import org.apache.commons.lang3.StringUtils;
import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* id生成帮助类
*/
public class IDUtil {
private static final AtomicInteger NEXT_COUNTER = new AtomicInteger(new SecureRandom().nextInt());
// 随机数种子
private static Random random;
// 六位随机数模版
private static DecimalFormat decimalFormat6;
// 四位随机数模版
private static DecimalFormat decimalFormat4;
static {
random = new Random();
decimalFormat6 = new DecimalFormat("000000");// 6位数字
decimalFormat4 = new DecimalFormat("0000");// 4位数字
}
/**
* 获取6位的随机数字验证码
*/
public static String getNumValidCode6() {
return decimalFormat6.format(random.nextInt(1000000));
}
/**
* 获取4位的随机数字验证码
*/
public static String getNumValidCode4() {
return decimalFormat4.format(random.nextInt(10000));
}
public static long getSimpleId() {
// 右移8位,让出低8位用于存放自增计数
long ntime = System.currentTimeMillis() << 8;
// 获取整形计数器的后8位
int ncounter = NEXT_COUNTER.getAndIncrement() & 0x000000ff;
// 合并时间和随机数
return ntime ^ ncounter;
}
public static String getHexSimpleId() {
return Long.toHexString(getSimpleId());
}
public static String getHexSimpleId(String projectName) {
return StringUtils.join(projectName, Long.toHexString(getSimpleId()), getNumValidCode4(), new Date().getTime());
}
/**
* 获取SimpleId中的时间戳
*/
public static long getTimeInSimpleId(long simpleId) {
return (simpleId >>> 8);
}
public static String simpleId2Hex(long simpleId) {
return Long.toHexString(simpleId);
}
public static void main(String[] args) {
int i = 0;
do {
System.out.println(getSimpleId());
i++;
} while (i < 20);
}
}