`
cloud21
  • 浏览: 396294 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

什么是UUID 以及UUID的版本

阅读更多
什么是UUID?
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:

经由一定的算法机器生成

为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。

非人工指定,非人工识别

UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。

在特定的范围内重复的可能性极小

UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
UUID是16字节128位长的数字,通常以36字节的字符串表示,示例如下:
3F2504E0-4F89-11D3-9A0C-0305E82C3301
其中的字母是16进制表示,大小写无关。
GUID(Globally Unique Identifier)是UUID的别名;但在实际应用中,GUID通常是指微软实现的UUID。
UUID的版本
UUID具有多个版本,每个版本的算法不同,应用范围也不同。
首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
00000000-0000-0000-0000-000000000000
UUID Version 1:基于时间的UUID
基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。
UUID Version 2:DCE安全的UUID
DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
UUID Version 4:随机UUID
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
UUID的应用
从UUID的不同版本可以看出,Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;至于Version 4,我个人的建议是最好不用(虽然它是最简单最方便的)。
通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:

映射类型的对象。比如只有代码及名称的代码表。
人工维护的非系统生成对象。比如系统中的部分基础数据。

对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)
UUID生成器
我没想着有人看完了这篇文章就去自己实现一个UUID生成器,所以前面的内容并不涉及算法的细节。下面是一些可用的Java UUID生成器:

Java UUID Generator (JUG):开源UUID生成器,LGPL协议,支持MAC地址。
UUID:特殊的License,有源码。
Java 5以上版本中自带的UUID生成器:好像只能生成Version 3/4的UUID。

此外,Hibernate中也有一个UUID生成器,但是,生成的不是任何一个(规范)版本的UUID,强烈不建议使用。
延伸阅读
UUID规范:rfc4122
DCE 1.1中的UUID
分享到:
评论

相关推荐

    uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid

    标题“uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid”表明这是一个关于使用C语言实现UUID生成的资源包。这个压缩包可能包含了一个C语言编写的程序或库,可以用来在Windows平台上(通过VC6编译器)生成...

    浅谈java获取UUID与UUID的校验

    java 获取 UUID 与 UUID 校验详解 Java 获取 UUID 是一个非常常见的操作,UUID(Universally Unique Identifier,全球唯一标识符)是一种软件建筑中用于标识信息的标识符。UUID 的主要用途是为了在分布式系统中生成...

    uuid.rar_uuid

    可能包含了如`uuid_generate()`用于生成新的UUID,`uuid_parse()`解析字符串形式的UUID,以及`uuid_compare()`比较两个UUID是否相同等函数。这些函数的实现通常基于RFC 4122,这是一个定义UUID生成和格式的标准。 ...

    javascript生成uuid的js库文件

    1. `uuid-js`库:这是一个基于RFC4122标准实现的JavaScript库,提供了V1到V5的所有版本UUID生成方法。其中,V1基于时间戳和MAC地址生成,V4完全是随机生成,V5则基于命名空间和SHA-1哈希算法。 2. `uuid`库(之前...

    PB生成UUID.zip

    UUID有多种版本,包括时间戳、MAC地址、随机数等方法生成。在PB中,具体使用哪种方式取决于所使用的编程语言和PB库的支持。例如,在Python中,可以使用`uuid`模块的`uuid4()`函数生成一个基于随机数的UUID;而在Java...

    ThinkPad System UUID1.82

    【ThinkPad System UUID1.82】是一款专为联想ThinkPad笔记本电脑设计的系统UUID添加工具,主要用于在制作U盘启动盘时解决特定问题。UUID(Universally Unique Identifier)是全球唯一的标识符,用于区分不同的计算机...

    Math.uuid.js

    根据RFC 4122标准,UUID由五个部分组成,分别是时间戳、时钟序列、节点ID、版本号和变种号。UUID的全局唯一性保证了在大规模系统中,每个生成的ID都是独一无二的,避免了冲突。 Math.uuid.js库的出现,旨在提供一个...

    uuid.zip_uuid

    UUID的设计标准有多种版本,如UUID版本1到5,每种都有其特定的生成机制。例如: 1. 版本1:基于时间戳、MAC地址和随机数,适合在网络环境中生成,但可能暴露MAC地址。 2. 版本2:与版本1类似,但使用了POSIX UID/...

    Javascript生成UUID 三种方法

    UUID根据生成方式的不同可以分为多个版本,其中最常用的是基于随机数的版本4 UUID。 #### 三、`Math.uuid()`方法详解 `Math.uuid()`是Math.uuid.js提供的基础方法,用于生成不同长度和基数的UUID。 - **参数说明*...

    UUID封装直接调用直接下载用

    例如,不要将UUID与个人敏感信息直接关联,避免无理由地收集和传输UUID,以及确保用户能够明确了解UUID的用途和处理方式。 总结来说,UUID在手机应用开发中主要用于唯一标识设备和区分用户,它在下载管理、数据分析...

    uuid-1.6.2.tar.gz

    总结来说,uuid-1.6.2.tar.gz是一个包含PostgreSQL uuid-ossp扩展1.6.2版本的源代码压缩包,用于生成全局唯一的UUID,尤其适用于分布式系统和需要独特ID的情景。用户可以通过一系列安装步骤将此扩展集成到他们的...

    16bit UUID一览表

    16bit UUID一览表 16位UUID是一种通用唯一标识符,用于标识蓝牙设备中的服务、特征和特征描述符。它是一个16位的二进制数字,通常用十六进制表示法表示。16位UUID是一种广泛使用的标识符,在蓝牙技术中扮演着重要...

    javaScript动态随即生成UUID

    下面,我们将深入探讨“javaScript动态随即生成UUID”的相关内容,包括UUID的基本概念、生成原理以及三种不同的生成方法。 ### UUID的基本概念 UUID,全称Universally Unique Identifier,即通用唯一识别码,是由...

    通过NDK获得UUID

    标题"通过NDK获得UUID"和描述涉及到利用Native Development Kit (NDK) 在Android系统底层获取UUID,以及通过Java层获取Android的唯一标识码。NDK允许开发者用C/C++编写部分应用,从而提高性能,特别是对于计算密集型...

    UUID生成模块源码,支持版本1,3,4,5

    UUID分为五个版本,每个版本有其特定的生成算法: 1. 版本1:基于时间的UUID。它结合了当前时间戳、机器ID和进程ID,确保在同一时间范围内,不同计算机生成的UUID是唯一的。 2. 版本3:基于命名的UUID(NV-UUID)...

    jdk与javauuidgenerator生成uuid

    UUID,全称Universally Unique Identifier,是用于唯一标识信息的128位数字。在Java中,UUID提供了标准的方法来生成全局唯一的标识符。UUID主要由三部分组成:时间戳、随机数和节点ID,这确保了其在全球范围内的唯一...

    cocoscreator刷新文件夹内所有的资源uuid

    下面将详细介绍如何在Cocos Creator中刷新文件夹内所有资源的UUID以及相关知识点。 1. **资源管理基础** - 在Cocos Creator中,资源是项目的核心组成部分,包括图片、音频、场景、精灵、脚本等。每个资源都有一个...

    UUID SPEC (Universally Unique IDentifier (UUID) URN Namespace)

    - **概述**:版本3和版本5的UUID是根据名称字符串生成的,其中版本3使用MD5散列算法,而版本5使用SHA-1散列算法。 - **生成步骤**:包括将名称字符串和命名空间ID组合起来进行散列计算,并按照规定格式填充UUID的...

    返回Long型UUid

    在Java编程中,UUID(Universally Unique Identifier)是一种标准的128位的唯一标识符,通常用于生成不可预测的全局唯一ID。然而,标准的UUID由32个16进制数字组成,形式上类似于“123e4567-e89b-12d3-a456-...

    fast-uuid用于快速高效地解析和编写UUID的Java库

    这个库由James Chambers开发,版本号为`80353be`,表明它是项目某个特定时期的稳定版本。 在Java开发中,工具类库起着非常关键的作用,它们提供了许多实用的功能,帮助开发者更高效地完成任务。`fast-uuid`就是这样...

Global site tag (gtag.js) - Google Analytics