您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页UUID的定义以及作用

UUID的定义以及作用

来源:小侦探旅游网
UUID的定义以及作⽤

UUID含义是通⽤唯⼀识别码 (Universally Unique Identifier),这 是⼀个软件建构的标准,也是被基⾦会 (Open Software Foundation, OSF)的组织应⽤在 (Distributed Computing Environment, DCE) 领域的重要部分。作⽤:

UUID 的⽬的是让中的所有元素,都能有唯⼀的辨识资讯,⽽不需要透过控制端来做辨识资讯的指定。如此⼀来,每个⼈都可以建⽴不与其它⼈冲突的 UUID。在这样的情况下,就不需考虑数据库建⽴时的名称重复问题。⽬前最⼴泛应⽤的 UUID,即是微软的 Microsoft'sGlobally Unique Identifiers (GUIDs),⽽其他重要的应⽤,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X等等。组成:

UUID是指在⼀台机器上⽣成的数字,它保证对在同⼀时空中的所有机器都是唯⼀的。通常平台会提供⽣成的API。按照(OSF)制定的标准计算,⽤到了以太⽹卡地址、纳秒级时间、芯⽚ID码和许多可能的数字UUID由以下⼏部分的组合:

(1)当前⽇期和时间,UUID的第⼀个部分与时间有关,如果你在⽣成⼀个UUID之后,过⼏秒⼜⽣成⼀个UUID,则第⼀个部分不同,其余相同。

(2)时钟序列。

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

UUID的唯⼀缺陷在于⽣成的结果串会⽐较长。关于UUID这个标准使⽤最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以⽤CreateUUID()函数很简单地⽣成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的⼀个⼗六进制的数字。⽽标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID()UDF进⾏转换。

应⽤:

使⽤UUID的好处在分布式的软件系统中(⽐如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所⽣成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使⽤的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何⽣成的通⽤唯⼀有⾮常⼤的区别。UUID最少在3000+年内不会重复。

通⽤唯⼀标识符还可以⽤来指向⼤多数的可能的物体。微软和其他⼀些软件公司都倾向使⽤全球唯⼀标识符(GUID),这也是通⽤唯⼀标识符的⼀种类型,可⽤来指向组建对象模块对象和其他的。第⼀个通⽤唯⼀标识符是在⽹络计算机系统(NCS)中创建,并且随后成为(OSF)的(DCE)的组件。

代码: C#1

2using System;3namespace Demo{4 public class Test {5

public static void Main()6 {

7 Guid guid=Guid.NewGuid();8 Console.WriteLine(guid);9 } }10}11Java

1package com.mytest;2import java.util.UUID;3public class UTest {

4 public static void main(String[] args) {5 UUID uuid = UUID.randomUUID();6 System.out.println(uuid);7}}Go1

import(

2 \"github.com/nu7hatch/gouuid\"3 \"fmt\"4) 5

6func main(){

7 fmt.Println(uuid.NewV4().String())}8

其他版本的介绍,组合在⼀起加深理解

什么是UUID?

UUID是Universally Unique Identifier的缩写,它是在⼀定的范围内(从特定的名字空间到全球)唯⼀的机器⽣成的标识符。UUID具有以下涵义:

经由⼀定的算法机器⽣成

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

⾮⼈⼯指定,⾮⼈⼯识别

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

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

UUID的⽣成规范定义的算法主要⽬的就是要保证其唯⼀性。但这个唯⼀性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。

UUID是16字节128位长的数字,通常以36字节的字符串表⽰,⽰例如下:3F2504E0-4F-11D3-9A0C-0305E82C3301其中的字母是16进制表⽰,⼤⼩写⽆关。

GUID(Globally Unique Identifier)是UUID的别名;但在实际应⽤中,GUID通常是指微软实现的UUID。UUID的版本

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

⾸先是⼀个特例--Nil UUID--通常我们不会⽤到它,它是由全为0的数字组成,如下:00000000-0000-0000-0000-000000000000UUID 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地址。:特殊的License,有源码。

Java 5以上版本中⾃带的UUID⽣成器:好像只能⽣成Version 3/4的UUID。

此外,Hibernate中也有⼀个UUID⽣成器,但是,⽣成的不是任何⼀个(规范)版本的UUID,强烈不建议使⽤。

【References】

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务