UUID能保证全局唯一性是因为其128位空间极大,随机生成时碰撞概率极低;Java中通过UUID.randomUUID()生成Version 4的UUID,适用于分布式系统、数据合并、离线操作等场景,避免ID冲突且无需中心化协调。

Java中的
UUID
UUID
使用
java.util.UUID
UUID.randomUUID()
import java.util.UUID;
public class UuidExample {
public static void main(String[] args) {
// 生成一个随机UUID
UUID uuid = UUID.randomUUID();
System.out.println("生成的UUID: " + uuid.toString());
// UUID的字符串形式通常是32个十六进制数字,由连字符分隔成五组
// 例如:a1b2c3d4-e5f6-7890-abcd-ef1234567890
// 从字符串解析UUID
String uuidString = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
try {
UUID parsedUuid = UUID.fromString(uuidString);
System.out.println("解析的UUID: " + parsedUuid);
} catch (IllegalArgumentException e) {
System.err.println("无效的UUID字符串: " + e.getMessage());
}
// 获取UUID的组成部分(高64位和低64位)
System.out.println("UUID的高64位: " + uuid.getMostSignificantBits());
System.out.println("UUID的低64位: " + uuid.getLeastSignificantBits());
}
}除了
randomUUID()
UUID
nameUUIDFromBytes(byte[] name)
谈到UUID的全局唯一性,这其实是一个概率问题,而不是绝对的数学保证。但这个概率低到我们几乎可以忽略不计。一个UUID是128位的数字,这意味着它能表示的数量是2的128次方,这是一个天文数字。为了有个概念,地球上的沙子数量可能都比这个少得多。
立即学习“Java免费学习笔记(深入)”;
具体到实现原理,我们通常说的“随机UUID”(Version 4)是基于纯粹的随机数。它的128位中有122位是完全随机生成的,另外6位则用于指示版本和变体。因为随机数生成器的质量足够高,且可用的随机数空间极大,所以两个随机生成的UUID发生碰撞的可能性微乎其微。在我看来,这种“几乎不可能碰撞”的特性,在绝大多数分布式场景下,已经足够支撑其作为全局唯一标识符的职责了。
当然,还有基于时间戳和MAC地址的UUID(Version 1),它利用了当前时间、序列号和网卡MAC地址的组合来保证唯一性。这种方式的优点是可以在一定程度上保证生成顺序,但缺点是可能会暴露生成UUID的机器信息,而且如果时钟回拨或MAC地址冲突,理论上也有小概率冲突。不过,在现代应用中,Version 4因其简单和极低的碰撞率,往往是更受欢迎的选择。
我个人觉得,在以下几种场景下,使用UUID作为数据库主键会是一个非常明智的选择:
当然,使用UUID作为主键也有其代价,比如它通常是字符串类型,占用存储空间更大,索引效率可能略低于整型主键,且由于其随机性,可能会导致数据库的B-tree索引页分裂,影响查询性能。所以,做选择时总要权衡利弊,看业务需求更侧重哪方面。
除了作为数据库主键,UUID的用武之地远不止这些,有些场景可能不那么显眼,但同样实用:
UUID.randomUUID().toString()
我觉得,UUID的强大之处在于它提供了一种无需中心协调就能保证“足够唯一”的能力。这使得开发者在设计系统时可以更加自由和灵活,减少了对集中式服务的依赖,从而提升了系统的可伸缩性和韧性。它就像一把万能钥匙,在很多需要“独一无二”的场景下,总能找到它的位置。
以上就是Java中UUID类的作用和使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号