一、什么是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时,我们也需要权衡其优缺点,并结合具体场景做出合理的选择。