参考:
http://stackoverflow.com/questions/1389736/how-do-i-create-a-unique-id-in-java/1389747 这里面最后一个人的回答,就是利用无符号右移,每6位转换为64制字符
http://blog.csdn.net/sskicgah/article/details/12904881 这位仁兄也参考了别人的就不列举了
?
思路:UUID为128位,取高低64位分别处理,转为64制字符,我没有按照Base64的字符表来,随着自己的性子惯了,也没有3字节转为4字节,参考别人直接64位每低6位转为int对应一个64制字符数组
?
class="java">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);
}
}
?效率么:100W数据,我这机器上是1100ms+
?