RFC4144中的Abstract 你了解多少?

发布时间:   来源:CSDN  

作者:沉默剑士

一、简介

UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统可以不借助中心节点,就可以生成UUID来标识一些唯一的信息;


(资料图片)

GUID,是Globally Unique Identifier的缩写,跟UUID是同一个东西,只是来源于微软。

规范定义

UUID来自于IETF发布的一个规范:

UUID来源于OSF的DCE规范,也就是RFC4122的前身

GUID来源于微软,注意RFC4122的作者之一是微软员工

下面摘录一下,RFC4144中的Abstract

不知道起什么标题好

1个UUID是1个16字节(128位)的数字;为了方便阅读,通常将UUID表示成如下的方式:

123e4567-e89b-12d3-a456-426655440000

1个UUID被连字符分为五段,形式为8-4-4-4-12的32个字符。

其中的字母是16进制表示,大小写无关。

二、不同的版本

UUID本身也经过了多个版本的演化,每个版本的算法都不同。

标准格式

UUID的格式是这样的:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

N那个位置,只会是8,9,a,b

M那个位置,代表版本号,由于UUID的标准实现有5个版本,所以只会是1,2,3,4,5

各个版本简介

版本1:基于时间的UUID

通过当前时间戳、机器MAC地址生成;

由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。

但与此同时,因为它暴露了电脑的MAC地址和生成这个UUID的时间,这就是这个版本UUID被诟病的地方。

在python里面的使用的例子:

>>> import uuid>>> uuid.uuid1()UUID("444b5cc0-ae5d-11e6-8d22-28924a431726")>>> uuid.uuid1()UUID("46a9bf21-ae5d-11e6-9549-28924a431726")

其中,最后的12个字符28924a431726就是我电脑网卡的MAC地址

版本2:DCE安全的UUID

DCE安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。

不过,在UUID的规范里面没有明确地指定,所以基本上所有的UUID实现都不会实现这个版本。

版本3:基于名字空间的UUID(MD5)

由用户指定1个namespace和1个具体的字符串,通过MD5散列,来生成1个UUID;

根据规范描述,这个版本的存在是为了向后兼容?平时这个版本我们也很少用到

在python里面的使用的例子:

>>> import uuid>>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")UUID("21fc48e5-63f0-3849-8b9d-838a012a5936")>>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")UUID("21fc48e5-63f0-3849-8b9d-838a012a5936")

在java中使用的例子

System.out.println(UUID.nameUUIDFromBytes("myString".getBytes("UTF-8")).toString());

Java只支持生成版本3和版本4的UUID

版本4:基于随机数的UUID

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。这个版本应该是平时大家无意中用得最多的版本了;

在python里面使用的例子:

>>> import uuid>>> uuid.uuid4()UUID("e584539d-a334-4f15-9819-88d73fcf707d")>>> uuid.uuid4()UUID("76ec02cc-1b1d-4ad3-bd09-a4f6d67c7af4")

以及Java中大家最熟悉的:

System.out.println(UUID.randomUUID().toString());

版本5:基于名字空间的UUID(SHA1)

和版本3一样,不过散列函数换成了SHA1

在python里面的使用的例子:

>>> import uuid>>> uuid.uuid5(uuid.NAMESPACE_DNS, "myString")UUID("cd086011-6aac-5a06-a94a-0b67c59649ba")>>> uuid.uuid5(uuid.NAMESPACE_DNS, "myString")UUID("cd086011-6aac-5a06-a94a-0b67c59649ba")

三、UUID的应用

从几个版本的定义来看,感觉都不是特别完美,可能版本4是平时用得最多的,但是在现实的业务场景中,考虑到可读性、唯一性、长度,我们一般也不会选择UUID当做数据库的主键。

至于其他场景的应用,可以结合具体的场景,来使用各个版本的实现。

四、UUID和各个编程语言

微软:http://msdn.microsoft.com/en-us/library/system.guid(v=vs.110).aspx

Linux:http://en.wikipedia.org/wiki/Util-linux

Android:http://developer.android.com/reference/java/util/UUID.html

PHP:http://php.net/manual/en/function.uniqid.php#94959

MySQL:http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_uuid

Java:http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html

nodejs - https://github.com/broofa/node-uuid

参考:

https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_3_.28MD5_hash_and_namespace.29

https://github.com/simongong/js-stackoverflow-highest-votes/blob/master/questions1-10/how-to-create-a-UUID-in-javascript.md

http://www.blogjava.net/feelyou/archive/2008/10/14/234320.html

END

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

相关文章Related

返回栏目>>