package org.fanhongtao.utils; /** * 生成唯一的编号序号生成器,所生成的序号为 “指定的前缀 + 序号”,序号从0开始,上限为<br> * 模仿Apache的axiom中的UUIDGenerator而写成。 * * @author Dharma * @created 2008-10-25 */ public class UIDGenerator { /** ID的前缀 */ private static String baseUID = null; /** ID的序号 */ private static long incrementingValue = 0; /** ID序号的最大值 */ private static long maxValue = 0; /** 字符形式的ID序号最大值的应长度 */ private static int maxValueLen = 0; /** 用于序号前补0的字符中数组 */ private static String ZEROS[] = null; static { UIDGenerator.init("", 9999); } /** * 初始化序号生成器 * @param baseUID 序号前缀 * @param maxValue 序号的最大值 */ public static void init(String baseUID, long maxValue) { UIDGenerator.baseUID = baseUID; UIDGenerator.maxValue = maxValue; UIDGenerator.maxValueLen = String.valueOf(maxValue).length(); StringBuffer buf = new StringBuffer(); ZEROS = new String[UIDGenerator.maxValueLen]; for (int i = 0; i < UIDGenerator.maxValueLen; i++) { ZEROS[i] = buf.toString(); buf.append('0'); } } /** * 返回一个唯一的ID。ID长度固定为: baseUID长度 + 13(系统时间的长度) + maxValue长度 * 当序号长度小于maxValue的长度时,会在序号的前面补0 。 * * @return string */ public static synchronized String getUID() { if (++incrementingValue >= maxValue) { incrementingValue = 0; } /* * System.currentTimeMillis()返回的是从1970-01-01开始的毫秒数。 * 当返回值为 9999999999xxx(10个9)时,共是 9999999999/3600/24/365 = 317 年。 * 即是 公元 2287 年之后的事情了。所以可以固定认为是13位数。 * * 基于性能考虑,不使用 String.format的形式,而是手工拼接字符串。 */ StringBuffer buf = new StringBuffer(64); buf.append(baseUID); buf.append(System.currentTimeMillis()); String s = String.valueOf(incrementingValue); buf.append(ZEROS[maxValueLen - s.length()]); buf.append(s); return buf.toString(); } /** * @param args */ public static void main(String[] args) { for (int i = 0; i < 150; i++) { System.out.println(UIDGenerator.getUID()); } } }