生成UUID和自定义UUID算法

简介: 生成UUID和自定义UUID算法



一、什么是UUID?

  UUID是一个128位(16字节)长度的标识符,旨在唯一地标识信息和资源。它由32个十六进制数字组成,通常以5个部分分隔开来,形如“8-4-4-4-12”的字符串。UUID的独特性来自于其生成算法,基于时间戳、生成者的唯一标识符和硬件信息等多个因素。这使得UUID在极小概率下出现重复的可能性。

二、UUID的应用场景

  UUID在各种软件系统中都被广泛应用。在分布式系统中,每个节点可以使用UUID来唯一标识自己,从而避免了中心化的标识分配管理。在数据库系统中,UUID常用作主键,保证在分布式环境中记录的唯一性。此外,UUID还常用于构建唯一的会话标识、生成唯一的文件名、标记资源等场景。

三、UUID的优缺点

  优点之一在于,UUID能够在分布式系统中生成全局唯一标识,不依赖中心化的标识分配管理。另外,UUID的生成算法列入了时间戳等多个因素,使得冲突的概率大大降低。然而,UUID也存在缺点,其中最重要的是其长度较长、可读性较差,不适合直接作为用户可见的标识符。

四、生成UUID和自定义UUID算法

1.生成UUID(纯UUID)

代码:
package Huas;
import java.util.UUID;
public class UuidDemo {
    public static void main(String[] args) {
         String uuid = UUID.randomUUID().toString();
          System.out.println("uuid = "+uuid);
    }
}
打印:

2.自定义UUID算法

代码:
package Huas;
import java.util.UUID;
public class UuidDemo {
    public static void main(String[] args) {
      //1.生成一个以lyqy -开头的ID,并且把里面的 - 去掉
      String lyqy = "lyqy-" + UUID.randomUUID().toString().replaceAll("-","");
      System.out.println("lyqy = "+lyqy);
      //2.生成一个以 dx- 开头的ID
      String uuid = String.valueOf(UUID.randomUUID());
      String dx = "dx-";
      dx += uuid;
      System.out.println("dx   = "+dx);;
    }
}
打印:

3.自定义UUID进阶版

代码:
package Huas;
import java.util.Random;
import java.util.UUID;
public class UuidDemo {
  //自定义ALLOWED_CHARS,列举UUID可以出现在字符
  private static final String ALLOWED_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  //自定义UUID长度
    private static final int UUID_LENGTH = 36;
    public static String generateUUID() {
        StringBuilder uuidBuilder = new StringBuilder(UUID_LENGTH);
        Random random = new Random();
        for (int i = 0; i < UUID_LENGTH; i++) {
            if (i == 8 || i == 13 || i == 18 || i == 23) {
                uuidBuilder.append('-');
            } else {
                uuidBuilder.append(ALLOWED_CHARS.charAt(random.nextInt(ALLOWED_CHARS.length())));
            }
        }
        return uuidBuilder.toString();
    }
    public static void main(String[] args) {
        String customUUID = generateUUID();
        System.out.println(customUUID+"\n"+"customUUID长度 = "+customUUID.length());
    }
}
打印:

解释:

  这段代码的作用是生成一个32位的UUID,并按照格式 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 进行分段,其中 X 代表由数字和字母组成的随机字符。

  首先,定义了一个常量 ALLOWED_CHARS,其中包含了所有允许出现的字符,包括数字、大写字母和小写字母。然后定义了常量 UUID_LENGTH,表示生成的UUID的长度。

   接下来,定义了一个 generateUUID() 方法,使用 StringBuilder 来构建UUID字符串。随机数生成器 Random 用来随机选择 ALLOWED_CHARS 中的字符拼接到 UUID 中。

   通过一个 for 循环,迭代长度为 UUID_LENGTH 的次数,其中 i 代表每次迭代的索引。在每次迭代中,如果索引 i 为 8、13、18 或 23,那么将"-"字符添加到 UUID 末尾,否则随机选择 ALLOWED_CHARS 中的字符添加到 UUID 末尾。

   最后,在 main() 方法中调用 generateUUID() 方法生成一个自定义格式的 UUID,并将其打印输出。

总结

  UUID作为一种用于生成唯一标识符的标准,在当今分布式系统和云计算的背景下显得尤为重要。它在各种场景中发挥着不可替代的作用,保证了分布式系统中各种信息的唯一性。同时,UUID也在一定程度上解决了分布式系统中唯一标识符的分配和管理问题。不过,在使用UUID时,我们也需要权衡其优缺点,并结合具体场景做出合理的选择。

相关文章
|
6月前
|
算法
自定义UUID算法
自定义UUID算法
53 0
|
6月前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
205 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
30天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
17 0
|
5月前
|
负载均衡 算法 Nacos
SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重
ReactorLoadBalancer接口,实现自定义负载算法需要实现该接口,并实现choose逻辑,选取对应的节点。
415 0
|
6月前
|
负载均衡 算法 Java
Ribbon自定义负载均衡算法
Ribbon自定义负载均衡算法
53 1
|
存储 算法 安全
全局唯一ID(自增ID、UUID、雪花算法)
一、介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
242 0
|
存储 运维 算法
UUID和雪花(Snowflake)算法该如何选择?
UUID和雪花(Snowflake)算法该如何选择?
318 0
|
11天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
8天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。