| 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<br/> | 
|      * 当前毫秒数(13) + 序列(2) + 服务标识(3)<br/> | 
|      * 等待机制:如果当前毫秒数的序列超过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编码<br/> | 
|      * yyyyMMddHHmmss(14) + 序列(7) + 服务标识(3)<br/> | 
|      * | 
|      */ | 
|     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()); | 
|     } | 
| } |