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()); } }