
package net.mmgg.util;import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.text.FieldPosition; import java.text.NumberFormat; import java.util.Random; import java.util.Stack; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
public class Identifier { private static final FieldPosition HELPER_POSITION = new FieldPosition(0); private static final long MAX = 999; private static final long FIX = 1388505600000l; private static long seq = 0; static final char[] array={'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','0','1','2','3','4','5','6','7','8','9','Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M'};
public static String generate() { synchronized (Identifier.class) { StringBuffer sb = new StringBuffer(""); long datetime = System.currentTimeMillis() - FIX; sb.append(datetime); NumberFormat nf = new DecimalFormat("000"); nf.format(seq, sb, HELPER_POSITION); if (seq == MAX) { seq = 0; } else { seq++; } return sb.toString(); } } private static String _10_to_62(long number){ Long rest=number; Stack<Character> stack=new Stack<Character>(); StringBuilder result=new StringBuilder(0); while(rest!=0){ stack.add(array[new Long((rest-(rest/62)*62)).intValue()]); rest=rest/62; } for(;!stack.isEmpty();){ result.append(stack.pop()); } return result.toString();
}public static String uid() { return _10_to_62(Long.parseLong(generate())); }
public static String generateRadix() { return Long.toString(Long.parseLong(generate()), Character.MAX_RADIX); } public static int getRandom(int min, int max) { return new Random().nextInt(Math.abs(max - min)) + min; }
public static int get6Number() { return getRandom(100000, 999999); } public static String uuid() { return UUID.randomUUID().toString(); }
public static long getIdtoDate(String id) { long longId = Long.parseLong(id, Character.MAX_RADIX); String ids = String.valueOf(longId); ids = ids.substring(0, ids.length() - 3); return Long.parseLong(ids) + FIX; }
}
补充阅读#
补充 Java 唯一 ID 示例的适用范围,区分进程内序列、随机标识与分布式唯一性。
如何理解与使用#
读代码时应找出时间、序列和随机部分,并确认计数状态存放在哪里;单进程中的同步并不能自动协调多个进程或多台机器。
验证与边界#
验证时覆盖并发、进程重启和时钟变化。数据库唯一约束及冲突处理仍有价值,不能仅凭方法名称包含“唯一”就省略边界检查。
