首页
Javascript
Html
Css
Node.js
Electron
移动开发
小程序
工具类
服务端
浏览器相关
前端收藏
其他
关于

关于UUID的二三事

2017年06月26日 发布 阅读(73) 作者:Jerman

一、简介

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

  1. This specification defines a Uniform Resource Name namespace for
  2. UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
  3. Unique IDentifier). A UUID is 128 bits long, and can guarantee
  4. uniqueness across space and time. UUIDs were originally used in the
  5. Apollo Network Computing System and later in the Open Software
  6. Foundation's (OSF) Distributed Computing Environment (DCE), and then
  7. in Microsoft Windows platforms.
  8. This specification is derived from the DCE specification with the
  9. kind permission of the OSF (now known as The Open Group).
  10. Information from earlier versions of the DCE specification have been
  11. 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里面的使用的例子:

  1. >>> import uuid
  2. >>> uuid.uuid1()
  3. UUID('444b5cc0-ae5d-11e6-8d22-28924a431726')
  4. >>> uuid.uuid1()
  5. 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里面的使用的例子:

  1. >>> import uuid
  2. >>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")
  3. UUID('21fc48e5-63f0-3849-8b9d-838a012a5936')
  4. >>> uuid.uuid3(uuid.NAMESPACE_DNS, "myString")
  5. UUID('21fc48e5-63f0-3849-8b9d-838a012a5936')

在java中使用的例子

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

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

版本4:基于随机数的UUID

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

在python里面使用的例子:

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

以及Java中大家最熟悉的:

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

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

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

在python里面的使用的例子:

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

三、UUID的应用

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

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

四、UUID和各个编程语言

参考:

版权声明:本站文章除特别声明外,均采用署名-非商业性使用-禁止演绎 4.0 国际 许可协议,如需转载,请注明出处

评论

  •  
  • 理解 JWT 的使用场景和优劣

    这样形如 A.B.C 的字符串时能敏感地认出这是使用了 jwt。发了这两篇文章后,有不少读者在文末留言,表达了对 jwt 使用方式的一些疑惑,以及到底哪些场景适合使用 jwt。我并不是 jwt 方面的专家,和不少读者一样,起初研究时我也存在相同疑惑,甚至在逐渐接触后产生了更大的疑惑,经过这段时间项目中的使用和一些自己思考,把个人的总结整理成此文。

    发布:2020-01-09 阅读(67)

  • Idea每次修改jsp都需要重启tomcat解决方法

    发布:2020-01-03 阅读(96)

  • 实现token自动续期

    go语言实现token自动续期

    发布:2019-12-31 阅读(170)

  • nodejs前后端添加RSA加密验证

    RSA加密的玩法

    发布:2019-12-30 阅读(106)

  • 使用OpenSSL生成RSA公钥和私钥

    发布:2019-12-29 阅读(89)

  • MongoDB unique唯一索引值,如何支持空值 ?

    发布:2019-12-29 阅读(81)

  • 捕获mongoose save()报错并返回Controller

    捕获save报错,返回controller

    发布:2019-12-29 阅读(80)

  • windows下安装配置nginx 反向代理

    win10下安装nginx,配置返向代理

    发布:2019-12-11 阅读(96)

  • Client does not support authentication protocol requested by server

    ERROR 9076 nodejs.SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client

    发布:2019-09-01 阅读(334)

  • Linux rpm命令详解

    RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序

    发布:2019-08-02 阅读(375)

  • Linux中apt与apt-get命令的区别与解释

    Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。

    发布:2019-03-04 阅读(601)

  • centos7设置、查看、删除环境变量的方法

    centos查看环境变量与设置环境变量在使用过程中很常见,本文整理了一些常用的与环境变量相关的命令,感兴趣的朋友可以参考下希望对你有所帮助

    发布:2018-12-27 阅读(1476)

  • linux CentOS 安装oh my Zsh

    linux cenos下安装oh my zsh,oh my zsh 用于管理zsh配置,使shell界面更美观。 Zsh 是一款功能强大终端(shell)软件,既可以作为一个交互式终端,也可以作为一个脚本解释器。它在兼容 Bash 的同时 (默认不兼容,除非设置成 emulate sh) 还有提供了很多改进。

    发布:2018-12-20 阅读(1766)

  • Nginx配置SSL证书,实现https访问

    以腾讯云为例,配置nginx,实现https访问

    发布:2018-11-23 阅读(951)

  • nginx设置二级域名指向子目录

    nginx设置二级域名指向子目录

    发布:2018-11-22 阅读(1166)

  • nginx性能优化

    发现ip访问比nginx快多了,知道nginx出问题了~ 得给他优化优化。优化后由原来的2.7s打开,到600ms打开~nginx优化还是有用的

    发布:2018-11-22 阅读(613)

  • Nginx开启gzip

    通过nginx开启gzip设置

    发布:2018-10-15 阅读(617)

  • linux云服务通过Nginx绑定多个域名

    通过Nginx反向代理,在一个云服务器上绑定多个域名,不同的域名访问不同的目录,端口

    发布:2018-10-11 阅读(931)

  • CentOS 7上安装Nginx

    如何在Linux(CentOS 7)上安装Nginx,作为反向代理服务器。

    发布:2018-10-11 阅读(790)

  • nginx实现CORS跨域配置

    nginx服务端实现CORS跨域配置

    发布:2018-06-20 阅读(72)

  • 关于UUID的二三事

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

    发布:2017-06-26 阅读(73)

  • tail命令详情

    命令从指定点开始将 File 参数指定的文件写到标准输出。如果没有指定文件,那么会使用标准输入。Number 变量指定将多少单元写到标准输出。Number 变量的值可以是正的或负的整数。如果值的前面有 +(加号),从文件开头指定的单元数开始将文件写到标准输出。如果值的前面有 -(减号),那么从文件末尾指定的单元数开始将文件写到标准输出。如果值前面没有 +(加号)或 -(减号),那么从文件末尾指定的单元号开始读取文件

    发布:2017-05-23 阅读(737)

  • 如何防止网站被爬虫爬取的几种办法

    今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢。

    发布:2014-05-26 阅读(63)

  • 网站设置301转各的各种方法

    将不带www的域名301重定向到带www的域名,利于SEO

    发布:2013-11-29 阅读(595)