【山外问道】什么是UUID

本文全面解析UUID(通用唯一识别码),涵盖其定义、组成、编码规则及版本特性,包括基于时间、DCE安全、基于名字和随机UUID等不同类型的生成算法。
本文打印版下载地址

[山外问道]什么是UUID-打印版.pdf

1、UUID的定义

UUID是通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,是开放软件基金会组织在分布式计算环境领域的一部分。其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识,任何地方产生的任意一个UUID都不会有相同的值。UUID的唯一缺陷在于生成的结果串会比较长,是一个128比特的数值。

目前最广泛应用的 UUID,即是微软的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

2、UUID的组成

UUID基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成。

(1)当前日期和时间:UUID的第一个部分与时间有关。

(2)时钟序列。

(3)全局唯一的IEEE机器识别号:如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

(4)Java Hibernate中:采用IP-JVM启动时间-当前时间右移32位-当前时间-内部计数(8-8-4-8-4)来组成UUID。

3、UUID的编码规则

UUID全局唯一标识符定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全惟一的系统信息。

(1)1-8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;

(2)9-16位采用底层的IP地址,在服务器集群中的惟一性;

(3)17-24位采用当前对象的HashCode值,在一个内部对象上的惟一性;

(4)25-32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。

4、UUID的版本

UUID具有多个版本,每个版本的算法不同,应用范围也不同。

(1)特例Nil UUID:通常用不到,由全为0的数字组成:00000000-0000-0000-0000-000000000000。

(2)基于时间的UUID

  • ① 基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。

  • ② 在算法中使用了MAC地址,保证了UUID在全球范围的唯一性,但会带来安全性问题。

  • ③ 使用退化的算法,以IP地址来代替MAC地址--Java的UUID这样实现的。

(3)DCE安全的UUID(Distributed Computing Environment)

DCE安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

(4)基于名字的UUID

  • ① 基于名字的UUID(MD5):通过计算名字和名字空间的MD5散列值得到。

  • ② 基于名字的UUID(SHA1):通过计算名字和名字空间的SHA1散列值得到。

  • ③ 基于名字的UUID保证了UUID的唯一性:

    • ❶ 相同名字空间中不同名字生成的UUID的唯一性;

    • ❷ 不同名字空间中的UUID的唯一性;

    • ❸ 相同名字空间中相同名字的UUID重复生成是相同的。

(5)随机UUID:根据随机数,或者伪随机数生成UUID,这种UUID产生重复的概率是可以计算出来的。

参考资料: 《百度百科-UUID

免责声明:本文是对《百度百科-UUID》的个人学习总结,属于个人的学习笔记,仅用于学习和分享交流,不涉及商业用途。如果本文发布的内容侵犯到相关的权益,请及时联系本人进行删除!

### UUID的定义、生成方式及应用场景 #### 一、UUID的定义 UUID(Universally Unique Identifier),即通用唯一识别码,是一种用于标识信息的标准方法。它是基于128位数字生成的一种独特标识符,旨在确保在全球范围内生成的每个UUID都具有唯一性[^1]。这种特性使得UUID非常适合在分布式环境中作为对象的唯一标识符使用。 #### 二、UUID的生成方式 1. **基于时间戳和硬件地址** UUID的核心生成原理依赖于多种因素组合而成,其中包括当前的时间戳、一个递增的计数器以及机器上的硬件特征(如MAC地址)。通过这些参数的综合运用,可以最大限度地减少重复的可能性[^1]。 2. **随机数生成法** 另一种常见的做法是利用伪随机数生成器来构建UUID。这种方法虽然不涉及具体的物理设备信息,但由于采用了高质量的熵源,同样能实现极高的唯一性保障水平[^3]。 3. **操作系统内置工具** 许多现代操作系统已经提供了便捷的方式来生产标准格式的UUID。例如,在Linux平台下可以直接访问 `/proc/sys/kernel/random/uuid` 文件获得一个新的UUID实例;也可以借助命令行工具 `uuidgen` 完成相同功能[^3]。 ```bash # Linux 下生成不含连字符(-)的标准UUID cat /proc/sys/kernel/random/uuid | sed 's/-//g' ``` 4. **编程语言支持** 大部分主流开发框架均包含了原生API或者第三方库帮助开发者轻松获取UUID值。以下是Python中的一段示例代码: ```python import uuid def generate_uuid(): unique_id = uuid.uuid4() return str(unique_id).replace('-', '') # 去掉分隔符得到纯字符串形式 ``` #### 三、UUID的应用场景 1. **数据库主键设计** 在大型分布式数据库架构里,采用UUID作为主键替代传统的自增长整型ID成为趋势之一。这样做的好处是可以避免跨服务器同步序列号所带来的复杂度问题,同时还能保持良好的性能表现[^2]。 2. **文件命名与版本控制** 对于需要长期保存并且可能会经历多次修订迭代的数据资源来说,赋予其独一无二的名字至关重要。此时便可以用到UUID技术来自动生成安全可靠的文件名或目录路径。 3. **会话跟踪和服务注册发现** Web应用程序经常需要用到临时性的Session ID或者其他类似的标记来进行用户行为分析或是负载均衡处理等工作流程当中。由于UUID具备高度不可预测的特点,所以特别适合作为此类场合下的令牌载体[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值