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
有更好的方案,欢迎讨论!!
分享到:
相关推荐
#### 二、Base64 编码与 UUID ##### 2.1 Base64 编码简介 Base64 编码是一种常用的二进制到文本的编码方式,它能将二进制数据转换为 ASCII 字符串,常用于电子邮件、网页和其他需要将二进制数据以文本形式传输或...
在 nodejs 上生成 UUID$ git clone https://github.com/lintide/UUIDBase64url.git$ cd UUIDBase64url$ npm install$ node index.js使用 UUID 库不过这个库只...将 uuid 转换为 base64 格式正常的 base64 格式包含 / +
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit...
uuid64介绍这是一个生成 64 位 UUID 的简单脚本。 UUID 的正常类型(例如 uuid 模块中可用的那些)是 128 位,它提供了更大的能力来避免生成值之间的冲突。 但是,有时使用较小的 UUID 会很方便,例如,如果生成的值...
雪花算法(Snowflake)是Twitter开源的一种分布式ID生成算法,它能有效地生成全局唯一的64位ID,这在很多场景下可以替代传统的UUID。 雪花算法的核心思想是将ID分为多个部分,分别是时间戳、工作节点ID和序列号,...
java 生成8位UUID,解决UUID2太长的问题,欢迎下载。后续代码,陆续放出
一个 node.js 模块,用于生成 v4 UUID 并将它们编码为 22 个字符的 URL-safe base64 slug 表示(参见 )。 Slug 是 url-safe base64 编码的 v4 uuid,去掉了 base64 =填充。 它们是使用生成的,该小心地在提供可用...
程序包的原始包装,用于使用Base64编码生成UUID v4。 原因是使用可打印字符获得通用且简短的UUID表示形式,无需特殊的UUID类型即可在JSON和数据库中有效使用它。 它仅产生22个字符,而不是带有分隔符的规范的36个...
尽管128位的UUID标准形式由32个十六进制数字组成,这里提到的"32位"可能是指显示或输入时使用的简化形式,即用户仅需要关注和输入生成UUID的一部分。这种工具简化了用户与UUID交互的过程,尤其是对于那些需要大量...
然而,32位的UUID实际上可能不满足全局唯一性的要求,因为128位UUID提供了足够的熵(随机性)来确保几乎不可能重复。32位的UUID在没有特定算法保证唯一性的情况下,可能会导致冲突。为了在32位范围内保持唯一性,...
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,...
4. **转换和打印**:生成的UUID是二进制形式,需要通过`uuid_unparse()`函数将其转换为字符串形式,便于显示和使用。 标签中的“c获得uuid”、“uuid_c”、“c生成uuid”、“c语言生成uuid”都强调了这是关于C语言...
例如,可以先用Base64对UUID进行编码,然后将Base64编码后的结果替换掉URL不安全的字符,最后进一步缩短字符串长度至22位。这种方法可能涉及到位运算、字符串操作以及对编码规则的理解。 紧凑型22位字符的实现步骤...
uuid生成,可生成16个字符的唯一码。使用方法,见main函数
它是一个16位的二进制数字,通常用十六进制表示法表示。16位UUID是一种广泛使用的标识符,在蓝牙技术中扮演着重要角色。 蓝牙技术的出现,使得设备之间的通信变得更加便捷和高效。然而,在蓝牙技术中,设备之间的...
在IT领域,UUID扮演着至关重要的角色,特别是在分布式系统和数据库设计中。UUID生成器是用来创建这些独特标识的工具,它确保生成的每个ID在全球范围内都是唯一的,避免了数据冲突。 在“uuid.zip_uuid”这个压缩包...
直接通过 dbo.[FunGetUUID32](NEWID())即可获取到32位UUID,非常简单方便。
短8位uuid 用于兑换码,不重复,,本人用很好用,,分享给大家
在这个过程中,还需要遵循UUID的规范,比如在第14位固定为4,在第19位设置特定的数值范围等,以确保生成的UUID属于版本4(基于随机数的UUID)。 ### 三种生成方法详解 #### 1. 基于自定义长度和基数的生成 此方法...
UUID 的格式是一个 32 位十六进制数字,通常以 5 个部分的形式表示,中间用连接符 "-" 分隔。例如:e65deb4c-a110-49c8-a4ef-6e69447968d6。其中,第一个部分是时域,第二个部分是时钟序列,第三个部分是节点 ID,第...