由於開發的需要,需要生成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也是可以唯一的