获取不同长度的UUID

在公司,有时候让处理一些命名规则时,要使用一个唯一标识,还是十六进制的,需要多少位看领导心情.

怎么做呢?你别说用随机产生组合的方法啊?虽然那个可行,但是我觉得难受.知道有UUID这个玩意儿之后,那就好办了.

UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的重要部分。

其实用UUID获取指定长度的唯一标识码还是比较方便的.所以,就复制粘贴写了个工具,获取4/8/12/16/20/24/36位的UUID值.就是生成一个UUID,然后截取作为返回值就ok了.
各位大神,我这个看着是比较low,见笑了.

package com.crcm.common.utils;

import java.util.UUID;
/**产生的UUID有这么长,通过截取和替换"-"后得到不同长度的UUID
 * 056085ce-8e46-492a-bcec-9a4d3690ce83
 * 8 + 4 + 4 + 4 + 12
 * @author 王俊
 * @since 2017.07.21
 *
 */
public class UUIDUtil {
    public static void main(String[] args) {
        System.out.println(get4UUID());
        System.out.println(get8UUID());
        System.out.println(get12UUID());
        System.out.println(get16UUID());
        System.out.println(get20UUID());
        System.out.println(get24UUID());
        System.out.println(get32UUID());
    }
    /**
     * 获得4个长度的十六进制的UUID
     * @return UUID
     */
    public static String get4UUID(){
        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[1];
        }
    /**
     * 获得8个长度的十六进制的UUID
     * @return UUID
     */
    public static String get8UUID(){
        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0];
    }
    /**
     * 获得12个长度的十六进制的UUID
     * @return UUID
     */
    public static String get12UUID(){
        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0]+idd[1];
    }
    /**
     * 获得16个长度的十六进制的UUID
     * @return UUID
     */
    public static String get16UUID(){

        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0]+idd[1]+idd[2];
    }
    /**
     * 获得20个长度的十六进制的UUID
     * @return UUID
     */
    public static String get20UUID(){

        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0]+idd[1]+idd[2]+idd[3];
    }
    /**
     * 获得24个长度的十六进制的UUID
     * @return UUID
     */
    public static String get24UUID(){
        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0]+idd[1]+idd[4];
    }
    /**
     * 获得32个长度的十六进制的UUID
     * @return UUID
     */
    public static String get32UUID(){
        UUID id=UUID.randomUUID();
        String[] idd=id.toString().split("-");
        return idd[0]+idd[1]+idd[2]+idd[3]+idd[4];
    }

}

有什么好的思路,欢迎交流.微信798961661

### Java 中生成固定长度或限制长度UUID 在标准的 Java 库中,`UUID` 类用于生成通用唯一标识符 (Universally Unique Identifier, UUID)。默认情况下,`UUID` 是基于 RFC 4122 的 128 位值表示法,并通常以字符串形式呈现为 `xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx`,其中每个 `x` 表示一个十六进制数字。 然而,默认的 UUID 字符串可能过长,在某些场景下不适合使用。为了生成较短的 UUID 或者将其转换为固定长度的字符串,可以通过以下几种方式实现: #### 方法一:截断原始 UUID 一种简单的方法是对完整的 UUID 字符串进行截取,保留所需的前缀部分作为缩短版的 ID。需要注意的是,这种方法可能会引入冲突风险,因为不同UUID 可能会共享相同的前缀。 ```java import java.util.UUID; public class ShortUUIDExample { public static String generateShortUUID(int length) { String uuid = UUID.randomUUID().toString(); return uuid.replace("-", "").substring(0, Math.min(length, uuid.length())); } public static void main(String[] args) { System.out.println(generateShortUUID(8)); // 输出类似于 'a7f9b3c5' } } ``` 此方法通过移除 `-` 并截取指定长度的部分来生成更短的 UUID[^1]。 --- #### 方法二:Base64 编码压缩 另一种常见的做法是利用 Base64 对 UUID 进行编码,从而减少其占用的空间。由于 Base64 使用更大的字符集(A-Z、a-z、0-9 加上 `/` 和 `+`),因此可以用较少的字符表示相同的信息量。 ```java import java.util.Base64; import java.util.UUID; public class Base64UUIDExample { public static String encodeToBase64(UUID uuid) { long msb = uuid.getMostSignificantBits(); // 获取高 64 位 long lsb = uuid.getLeastSignificantBits(); // 获取低 64 位 byte[] bytes = new byte[16]; ByteBuffer.wrap(bytes).putLong(msb).putLong(lsb); // 将两个 long 转换为字节数组 return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); } public static void main(String[] args) { UUID uuid = UUID.randomUUID(); System.out.println(uuid.toString()); // 原始 UUID System.out.println(encodeToBase64(uuid)); // Base64 编码后的版本 } } // 辅助类 import java.nio.ByteBuffer; ``` 上述代码片段展示了如何将 UUID 转换成紧凑的 Base64 表达形式。 --- #### 方法三:自定义哈希算法 如果需要进一步降低长度或者完全控制生成逻辑,则可以考虑采用散列函数(如 MD5 或 SHA-1)。不过要注意这些方法并不保证全局唯一性,仅适用于局部范围内的应用需求。 ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.UUID; public class HashedUUIDExample { public static String hashUUID(UUID uuid, int maxLength) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); md.update((uuid.toString()).getBytes()); byte[] digest = md.digest(); StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(String.format("%02x", b)); } return sb.substring(0, Math.min(maxLength, sb.length())); } public static void main(String[] args) throws Exception { System.out.println(hashUUID(UUID.randomUUID(), 10)); // 输出类似 'd8e7f...' } } ``` 这里采用了 MD5 散列技术对原生 UUID 进行处理后再裁剪至所需大小。 --- #### 总结 以上介绍了三种不同策略来满足 “限制长度”的 UUID 需求: 1. **直接截断** —— 简单快速但存在潜在重复隐患; 2. **Base64 编码** —— 提供更高的信息密度而无需牺牲太多安全性; 3. **定制化哈希方案** —— 更灵活但也最复杂且需权衡性能与可靠性之间的关系。 每种方法都有各自的优缺点,请依据实际应用场景选择合适的技术路线。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值