UUID为128位,取高低64位分别处理,转为64制字符,我没有按照Base64的字符表来,随着自己的性子惯了,也没有3字节转为4字节,参考别人直接64位每低6位转为int对应一个64制字符数组(这样其实最后一组只有4位转为64制字符)
public class GenerateShortUUID { private final static char[] DIGITS64 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray(); public static String next() { UUID u = UUID.randomUUID(); // return u.toString(); return toIDString(u.getMostSignificantBits()) + toIDString(u.getLeastSignificantBits()); } private static String toIDString(long l) { char[] buf = "00000000000".toCharArray(); // 限定11位长度 int length = 11; long least = 63L; // 0x0000003FL do { buf[--length] = DIGITS64[(int) (l & least)]; // l & least取低6位 /* 无符号的移位只有右移,没有左移 * 使用“>>>”进行移位 */ l >>>= 6; } while (l != 0); return new String(buf); } public static void main(String[] args) { long time = System.currentTimeMillis(); for (int i=0; i<1000000L; i++) { next(); } System.out.println(System.currentTimeMillis() - time); } }
效率之前有测试过忘记了,应该还可以,你们测试过的话可以告诉我。