1、简介javascript
UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统能够不借助中心节点,就能够生成UUID来标识一些惟一的信息;php
GUID,是Globally Unique Identifier的缩写,跟UUID是同一个东西,只是来源于微软。html
规范定义java
UUID来自于IETF发布的一个规范:A Universally Unique IDentifier (UUID) URN Namespace。node
UUID来源于OSF的DCE规范,也就是RFC4122的前身python
GUID来源于微软,注意RFC4122的做者之一是微软员工mysql
下面摘录一下,RFC4144中的Abstractlinux
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.android
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.
不知道起什么标题好git
1个UUID是1个16字节(128位)的数字;为了方便阅读,一般将UUID表示成以下的方式:
123e4567-e89b-12d3-a456-426655440000
1个UUID被连字符分为五段,形式为8-4-4-4-12的32个字符。
其中的字母是16进制表示,大小写无关。
2、不一样的版本
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')
3、UUID的应用
从几个版本的定义来看,感受都不是特别完美,可能版本4是平时用得最多的,可是在现实的业务场景中,考虑到可读性、惟一性、长度,咱们通常也不会选择UUID当作数据库的主键。
至于其余场景的应用,能够结合具体的场景,来使用各个版本的实现。
4、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...