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) + "毫秒"); } }