package cn.emay.sdk.util;
import java.util.Calendar;
import java.util.Date;
/**
* 唯一序列生成器
*
* @author Frank
*
*/
public class OnlyIdGenerator {
/**
* 补全字段
*/
private static String ZERO10 = "0000000000";
/**
* ID 序列
*/
private static int ID_INDEX = 0;
/**
* ID 序列计算时间
*/
private static long ID_END_MILLIS = 0l;
/**
* 生成18位的唯一数字ID
* 当前毫秒数(13) + 序列(2) + 服务标识(3)
* 等待机制:如果当前毫秒数的序列超过100,则等待累加到下一毫秒。即每毫秒最多生成100个smsid
*
* @return
*/
public synchronized static String genOnlyId(String serverCode) {
long millis = System.currentTimeMillis();
if (millis == ID_END_MILLIS) {
ID_INDEX++;
} else {
ID_INDEX = 0;
ID_END_MILLIS = millis;
}
if (ID_INDEX > 99) {
boolean wait = true;
while (wait) {
millis = System.currentTimeMillis();
if (millis != ID_END_MILLIS) {
wait = false;
ID_END_MILLIS = millis;
ID_INDEX = 0;
}
}
}
String indexStr = ZERO10 + ID_INDEX;
indexStr = indexStr.substring(indexStr.length() - 2, indexStr.length());
String smsId = millis + indexStr + serverCode;
return smsId;
}
/**
* BID 序列
*/
private static int BID_INDEX = 0;
/**
* BID 序列计算时间
*/
private static String BID_END_MILLIS = "";
/**
* 生成唯一BID编码
* yyyyMMddHHmmss(14) + 序列(7) + 服务标识(3)
*
*/
public synchronized static String genOblyBId(String serverCode) {
String time = DateUtil.toString(new Date(), "yyyyMMddHHmmss");
if (BID_END_MILLIS.equals(time)) {
BID_INDEX++;
} else {
BID_INDEX = 0;
BID_END_MILLIS = time;
}
String indexStr = ZERO10 + BID_INDEX;
indexStr = indexStr.substring(indexStr.length() - 7, indexStr.length());
String no = time + indexStr + serverCode;
return no;
}
public static String paramSmsId(String smsId) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(smsId.substring(0, 13)));
String name = DateUtil.toString(calendar.getTime(), "yyyyMMdd");
return name;
}
public static void main(String[] args) {
String genid = genOnlyId("111");
System.out.println(genid + "\t" + genid.length());
}
}