`
曾经de迷茫
  • 浏览: 14992 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

利用 Base64 缩短 UUID 至22位

    博客分类:
  • web
Web 
阅读更多

UUID还是比较常用的,尤其在web应用里。

有时在URL中传播,感觉比较长,于是想对其进行缩短,查询了一些资料,发现目前最短是到 22 位(使用URL传播非转义字符,结合Base64)

 

废话少说,代码奉上:

public class UuidBase64ShortMap implements StringShortMap{
    /**
     *
     *把UUID 转为 22位长字符串
     */
    public String shorter(String s) {
        char[] res = Base64.encode(asBytes(s));
        return new String(res,0,res.length-2);
    }

   /**
     *
     *把22位长字符串转为 UUID
     */
    public String recover(String s) {
        int len = s.length();
        char[] chars = new char[len+2];
        chars[len]=chars[len+1]='_';
        for(int i=0;i<len;i++){
            chars[i]=s.charAt(i);
        }
        return toUUID(Base64.decode(chars)).toString();
    }
    public static byte[] asBytes(String id) {
        UUID uuid=UUID.fromString(id);
        long msb = uuid.getMostSignificantBits();
        long lsb = uuid.getLeastSignificantBits();
        byte[] buffer = new byte[16];

        for (int i = 0; i < 8; i++) {
                buffer[i] = (byte) (msb >>> 8 * (7 - i));
        }
        for (int i = 8; i < 16; i++) {
                buffer[i] = (byte) (lsb >>> 8 * (7 - i));
        }
        return buffer;

    }

    public static UUID toUUID(byte[] byteArray) {
        long msb = 0;
        long lsb = 0;
        for (int i = 0; i < 8; i++)
                msb = (msb << 8) | (byteArray[i] & 0xff);
        for (int i = 8; i < 16; i++)
                lsb = (lsb << 8) | (byteArray[i] & 0xff);
        UUID result = new UUID(msb, lsb);

        return result;
    }
    
    public static void main(String[] args) {
                StringShortMap shortm = new UuidBase64ShortMap();
//        String uuid = "3b01174f-3139-4a5b-a949-bb7e80b55f91";
//        System.out.println(Base64.encode(uuid));
//        String shorter= shortm.shorter(uuid);
//        System.out.println(shorter);
//        System.out.println(shortm.recover(shorter) +"\t" + uuid);
        
//        for(int i=0;i<100000;i++){
//            String Uuid = UUID.randomUUID().toString();
//            System.out.println(Uuid +"\t" + shortm.shorter(Uuid));
//        }
        
        String[] uuids={"f6e0e040-be3d-4573-964c-88724a8fa7d3","c19b9de1-f33a-494b-afbe-f06817218d63","f08f0b2c-66fb-41a3-99c3-ac206089c3ad"};
        for(String s :uuids){
            System.out.println(shortm.shorter(s));
        }
    }
}

运行结果

9uDgQL49RXOWTIhySo*n0w
wZud4fM6SUuvvvBoFyGNYw
8I8LLGb7QaOZw6wgYInDrQ
 

有更好的方案,欢迎讨论!!

 

分享到:
评论
2 楼 sskicgah 2013-10-17  
wddpwzzhao123 写道
Base64.encode  这个试了好多都不行

用这篇里面的base64可以http://blog.csdn.net/lastsweetop/article/details/5314640

楼主,你这段代码是不是写错了?
for (int i = 8; i < 16; i++) {   
    buffer[i] = (byte) (lsb >>> 8 * (7 - i));
}


这个应该是 buffer[i] = (byte) (lsb >>> 8 * (i - 7)); 吧?
虽然最后都是转成byte。
1 楼 wddpwzzhao123 2013-04-19  
Base64.encode  这个试了好多都不行

相关推荐

    Java 中将 UUID 存储为 Base64 字符串

    #### 二、Base64 编码与 UUID ##### 2.1 Base64 编码简介 Base64 编码是一种常用的二进制到文本的编码方式,它能将二进制数据转换为 ASCII 字符串,常用于电子邮件、网页和其他需要将二进制数据以文本形式传输或...

    UUIDBase64url:UUID转换为URL安全base64

    在 nodejs 上生成 UUID$ git clone https://github.com/lintide/UUIDBase64url.git$ cd UUIDBase64url$ npm install$ node index.js使用 UUID 库不过这个库只...将 uuid 转换为 base64 格式正常的 base64 格式包含 / +

    javabase64-1.3.1

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit...

    uuid64:短 UUID

    uuid64介绍这是一个生成 64 位 UUID 的简单脚本。 UUID 的正常类型(例如 uuid 模块中可用的那些)是 128 位,它提供了更大的能力来避免生成值之间的冲突。 但是,有时使用较小的 UUID 会很方便,例如,如果生成的值...

    利用雪花算法生成uuid

    雪花算法(Snowflake)是Twitter开源的一种分布式ID生成算法,它能有效地生成全局唯一的64位ID,这在很多场景下可以替代传统的UUID。 雪花算法的核心思想是将ID分为多个部分,分别是时间戳、工作节点ID和序列号,...

    java生成8位UUID

    java 生成8位UUID,解决UUID2太长的问题,欢迎下载。后续代码,陆续放出

    slugid:用于生成 22 个字符段的 URL 安全 base64 UUID 编码器

    一个 node.js 模块,用于生成 v4 UUID 并将它们编码为 22 个字符的 URL-safe base64 slug 表示(参见 )。 Slug 是 url-safe base64 编码的 v4 uuid,去掉了 base64 =填充。 它们是使用生成的,该小心地在提供可用...

    util-js-uuid:具有紧凑型Base64格式的UUID实用程序

    程序包的原始包装,用于使用Base64编码生成UUID v4。 原因是使用可打印字符获得通用且简短的UUID表示形式,无需特殊的UUID类型即可在JSON和数据库中有效使用它。 它仅产生22个字符,而不是带有分隔符的规范的36个...

    32位UUID生成工具,16进制

    尽管128位的UUID标准形式由32个十六进制数字组成,这里提到的"32位"可能是指显示或输入时使用的简化形式,即用户仅需要关注和输入生成UUID的一部分。这种工具简化了用户与UUID交互的过程,尤其是对于那些需要大量...

    java 生成32位UUID

    然而,32位的UUID实际上可能不满足全局唯一性的要求,因为128位UUID提供了足够的熵(随机性)来确保几乎不可能重复。32位的UUID在没有特定算法保证唯一性的情况下,可能会导致冲突。为了在32位范围内保持唯一性,...

    base64算法

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,...

    uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid

    4. **转换和打印**:生成的UUID是二进制形式,需要通过`uuid_unparse()`函数将其转换为字符串形式,便于显示和使用。 标签中的“c获得uuid”、“uuid_c”、“c生成uuid”、“c语言生成uuid”都强调了这是关于C语言...

    UUIDs的紧凑型22位字符URL安全表示

    例如,可以先用Base64对UUID进行编码,然后将Base64编码后的结果替换掉URL不安全的字符,最后进一步缩短字符串长度至22位。这种方法可能涉及到位运算、字符串操作以及对编码规则的理解。 紧凑型22位字符的实现步骤...

    uuid生成16位的,唯一码

    uuid生成,可生成16个字符的唯一码。使用方法,见main函数

    16bit UUID一览表

    它是一个16位的二进制数字,通常用十六进制表示法表示。16位UUID是一种广泛使用的标识符,在蓝牙技术中扮演着重要角色。 蓝牙技术的出现,使得设备之间的通信变得更加便捷和高效。然而,在蓝牙技术中,设备之间的...

    uuid.zip_uuid

    在IT领域,UUID扮演着至关重要的角色,特别是在分布式系统和数据库设计中。UUID生成器是用来创建这些独特标识的工具,它确保生成的每个ID在全球范围内都是唯一的,避免了数据冲突。 在“uuid.zip_uuid”这个压缩包...

    自动生成32位UUID的函数

    直接通过 dbo.[FunGetUUID32](NEWID())即可获取到32位UUID,非常简单方便。

    短8位uuid 用于兑换码

    短8位uuid 用于兑换码,不重复,,本人用很好用,,分享给大家

    javaScript动态随即生成UUID

    在这个过程中,还需要遵循UUID的规范,比如在第14位固定为4,在第19位设置特定的数值范围等,以确保生成的UUID属于版本4(基于随机数的UUID)。 ### 三种生成方法详解 #### 1. 基于自定义长度和基数的生成 此方法...

    浅谈java获取UUID与UUID的校验

    UUID 的格式是一个 32 位十六进制数字,通常以 5 个部分的形式表示,中间用连接符 "-" 分隔。例如:e65deb4c-a110-49c8-a4ef-6e69447968d6。其中,第一个部分是时域,第二个部分是时钟序列,第三个部分是节点 ID,第...

Global site tag (gtag.js) - Google Analytics