Java 缩短UUID为22位

参考

  • http://stackoverflow.com/ques…

    这里面rharari的回答,就是利用无符号右移,每6位转换为64制字符

  • http://blog.csdn.net/sskicgah…

    这位仁兄也参考了别人的就不列举了

思路

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);
    }
}

效率之前有测试过忘记了,应该还可以,你们测试过的话可以告诉我。

原文 

https://segmentfault.com/a/1190000018894858

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java 缩短UUID为22位

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址