package com.dy.pipIrrWebFile.fm;
|
|
import java.util.Calendar;
|
|
public class FileNameIdUtil {
|
|
private static int add = 0 ;
|
private static int chengShu = 1000 ;
|
private static int maxAdd = 999 ;
|
private static long last = 0 ;
|
|
//后缀
|
private static String suffix = "0" ;
|
|
static {
|
last = current() ;
|
}
|
|
/**
|
* 为自实现程序提供的ID生成器
|
* 15长度ID,年度取两位,如果是17位长度ID,年度取四位,那17位数字超出了javascript的表数范围
|
*/
|
public String generate(){
|
return doGenerate() ;
|
}
|
|
/**
|
* 设置后缀,不同子系统设置不同的后缀
|
* @param suffix
|
*/
|
public static void setSuffix(String suffix)throws Exception{
|
if(suffix == null || suffix.trim().equals("")){
|
throw new Exception("后缀不能为空") ;
|
}
|
FileNameIdUtil.suffix = suffix.trim() ;
|
}
|
|
/**
|
* 执行生成
|
* @return
|
*/
|
private synchronized String doGenerate(){
|
Long id = null ;
|
long now = current() ;
|
if(now != last){
|
//上次生成ID 与本次生成ID 不在同一秒内
|
last = now ;
|
add = 0 ;
|
id = last * chengShu + add ++;
|
}else{
|
//上次生成ID 与本次生成ID 在同一秒内
|
if(add == maxAdd){
|
//附加量已经用尽
|
waitNextSecond(last) ;//等到下一秒
|
id = last * chengShu + add ++ ;//返回上一秒生成的ID
|
add = 0 ;//附加量归零,为下一秒准备
|
}else{
|
//附加量未用尽
|
id = last * chengShu + add ++ ;
|
}
|
}
|
return id + suffix ;
|
}
|
/**
|
* 等待下一秒到来
|
* @param last
|
*/
|
private void waitNextSecond(Long last){
|
try {
|
Thread.sleep(10);
|
} catch (InterruptedException e) {
|
}finally{
|
long now = current() ;
|
if(now == last){
|
waitNextSecond(last) ;
|
}
|
}
|
}
|
|
|
|
/**
|
* 格式为 150516010203
|
* @return
|
*/
|
private static long current(){
|
Calendar cal = Calendar.getInstance();
|
long d = (cal.get(Calendar.YEAR) % 100) * 10000000000L
|
+ (cal.get(Calendar.MONTH) + 1) * 100000000L
|
+ cal.get(Calendar.DAY_OF_MONTH) * 1000000L
|
+ cal.get(Calendar.HOUR_OF_DAY) * 10000L
|
+ cal.get(Calendar.MINUTE) * 100L
|
+ cal.get(Calendar.SECOND) ;
|
|
return d ;
|
}
|
|
public static void main(String args[]){
|
FileNameIdUtil o = new FileNameIdUtil() ;
|
int total = 800 ;
|
long start = System.currentTimeMillis() ;
|
for(int i = 0 ; i < total ; i++){
|
System.out.println((String)(o.generate())) ;
|
}
|
long end = System.currentTimeMillis() ;
|
System.out.println("产生" + total + "ID用时" + (end - start) + "毫秒");
|
}
|
|
}
|