资讯专栏INFORMATION COLUMN

Java 缩短UUID为22位

Michael_Ding / 1305人阅读

摘要:参考这里面的回答,就是利用无符号右移,每位转换为制字符这位仁兄也参考了别人的就不列举了思路为位,取高低位分别处理,转为制字符,我没有按照的字符表来,随着自己的性子惯了,也没有字节转为字节,参考别人直接位每低位转为对应一个制字符数组这样其实最

参考

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://www.ucloud.cn/yun/74137.html

相关文章

  • 关于UUID的二三事

    摘要:规范定义来自于发布的一个规范。其中的字母是进制表示,大小写无关。在里面的使用的例子其中,最后的个字符就是我电脑网卡的地址版本安全的安全的和基于时间的算法相同,但会把时间戳的前位置换为的或。 一、简介 UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统可以不借助中心节点,就可以生成UUID来标识一些唯一的信息; GUID,...

    2json 评论0 收藏0
  • 分布式id生成方案概述

    摘要:序本文主要来聊聊分布式的生成方案。分布式的生成,以为代表的,系列算法采用的就是划分命名空间并行生成的思路。 序 本文主要来聊聊分布式id的生成方案。 目标 业务系统需要什么样的ID生成器中提出了几点目标: 唯一性 时间相关 粗略有序 可反解 可制造 主要思路 对于每个标识,都需要有一个命名空间(namespace),来保证其相对唯一性。分布式的ID生成,以Twitter Snowf...

    Terry_Tai 评论0 收藏0
  • 分布式ID系列(2)——UUID适合做分布式ID吗

    摘要:用户指定一个名字空间和一个字符串,通过散列,生成。字符串本身需要是唯一的。。虽然是基于随机数,但是重复的可能性可以忽略不计,因此该版本也是被经常使用的版本。。当前正在使用的。。 UUID的生成策略: UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。U...

    wayneli 评论0 收藏0
  • 邀请好友注册,模拟百度网盘(java语言)

    摘要:我的思路大体是用网络范围内唯一的字符串为标识去邀请好友,邀请者给个状态位代表邀请者,并给他绑定个唯一。本人建立个群作为去转盘网的官方群,人数现在也不多,如果有兴趣的话来逛逛吧,多个粉丝去转盘多一份热闹,群号 花了一年时间做了个网盘下载站点,有兴趣的朋友可以看看站名:去转盘网其中有个需求是想模拟百度网盘的邀请好友注册功能,想了很久果然皇天不负有心人,终于整理出个思路,并且附上代码,希望各...

    learn_shifeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<