由于开发的需要,需要生成20位的长度的数字组成的id,首先要满足唯一性,那样的话就需要使用到时间戳来生成,java生成的时间戳是毫秒级的,理论上还是会发生产生相同的id,这是一件很头疼的一件事。
1、解决思路一:
在生成的13位长度的时间戳上面加上3位的自曾数
2017+1492764117143+XXX
代码如下:
package my;
import java.text.SimpleDateFormat;
/**
* 获取20位随机数
* 4位年份+13位时间戳+3位随机数
* @author yuyu
*/
public class GetTime {
public static void main(String[] args) {
//调用生成id方法
System.out.println(getGuid());
}
/**
* 20位末尾的数字id
*/
public static volitale int Guid=100;
public static String getGuid() {
GetTime.Guid+=1;
long now = System.currentTimeMillis();
//获取4位年份数字
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy");
//获取时间戳
String time=dateFormat.format(now);
String info=now+"";
//获取三位随机数
//int ran=(int) ((Math.random()*9+1)*100);
//要是一段时间内的数据连过大会有重复的情况,所以做以下修改
int ran=0;
if(GetTime.Guid>999){
GetTime.Guid=100;
}
ran=GetTime.Guid;
return time+info.substring(2, info.length())+ran;
}
}
输出如下:
20171492765221643100
20171492765422922101
20171492765429776102
*但是这样还是会有重复调用的时候随机数一样的情况,但是这样的概率会很小很小,但是理论上是有可能出现的,但在实际开发中不会达到如此高的运行速度,这样产生的id也是可以唯一的