资讯专栏INFORMATION COLUMN

关于UUID的二三事

2json / 1693人阅读

摘要:规范定义来自于发布的一个规范。其中的字母是进制表示,大小写无关。在里面的使用的例子其中,最后的个字符就是我电脑网卡的地址版本安全的安全的和基于时间的算法相同,但会把时间戳的前位置换为的或。

一、简介

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

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

规范定义

UUID来自于IETF发布的一个规范:A Universally Unique IDentifier (UUID) URN Namespace。

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

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

下面摘录一下,RFC4144中的Abstract

This specification defines a Uniform Resource Name namespace for
UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
Unique IDentifier). A UUID is 128 bits long, and can guarantee
uniqueness across space and time. UUIDs were originally used in the
Apollo Network Computing System and later in the Open Software
Foundation"s (OSF) Distributed Computing Environment (DCE), and then
in Microsoft Windows platforms.

This specification is derived from the DCE specification with the
kind permission of the OSF (now known as The Open Group).
Information from earlier versions of the DCE specification have been
incorporated into this document.
不知道起什么标题好

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-...
Linux:http://en.wikipedia.org/wiki/...
Android:http://developer.android.com/...
PHP:http://php.net/manual/en/func...
MySQL:http://dev.mysql.com/doc/refm...
Java:http://docs.oracle.com/javase...
nodejs - https://github.com/broofa/nod...
参考:

https://en.wikipedia.org/wiki...
https://github.com/simongong/...
http://www.blogjava.net/feely...

转自:http://www.jianshu.com/p/d77f...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17609.html

相关文章

  • 与dom事件流相关的二三事

    摘要:但对于整个事件流上的别的元素来说,执行顺序还会受到另外一个因素的影响。以上面的场景为例,在捕获阶段执行的事件,如果执行,则事件流终止,不会到达目标阶段,的世界则不会被执行执行结果为线上参考事件流 向dom绑定事件的事件的三种方式 行内绑定 按钮 js内绑定 btnDom.onclick = function clickHandler() { console.log(click)...

    Anleb 评论0 收藏0
  • 数组方法的二三事

    摘要:常用的数组方法删除数组的最后一个元素,返回被删除的元素,原数组长度减。原数组发生了变化,但没有创建新的数组。将指定数组进行排序,返回排好序的数组。颠倒数组元素的顺序,返回逆序后的数组。 数组,对于每一个前端人员来说是非常常见且重要的数据结构之一,也是面试常常出现的题目,掌握数组的方法能帮助我们更高效地处理问题。不过在数组的学习中,我们常常会混淆数组本身的方法和Javascript提供的...

    VincentFF 评论0 收藏0
  • 前端渲染过程的二三事

    摘要:前端渲染过程的二三事本文不会介绍整个前端渲染过程的步骤,只是记录最近阅读的文章的些许思考和感悟。那么现在我们可以明白这个问题的关键所在了,因为在大部分页面中是拥有的,而由于其解析顺序,那么在事件之前必定已经成功构造树。 前端渲染过程的二三事 本文不会介绍整个前端渲染过程的步骤,只是记录最近阅读的文章的些许思考和感悟。(文章地址一(系列),文章地址二) 希望大家在阅读这篇文章之前能将上述...

    Rindia 评论0 收藏0
  • 分表后需要注意的二三事

    摘要:分表字段的选择。问题产生之前提到在分表应用上线前我们需要将原有表的数据迁移到新表中,这样才能保证业务不受影响。虽说凌晨的业务量下降,但依然有少部分的请求过来,也会出现各种数据库异常。 showImg(https://segmentfault.com/img/remote/1460000019462791?w=496&h=285); 前言 本篇是上一篇《一次分表踩坑实践的探讨》,所以还没...

    dongxiawu 评论0 收藏0

发表评论

0条评论

2json

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<