点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

作者:沉默剑士

www.jianshu.com/p/d77f3ef0868a

一、简介

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

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

规范定义

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

https://www.ietf.org/rfc/rfc4122.txt

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-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

热门内容:
  • 徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~

  • 写了个牛逼的日志切面,甩锅更方便了!

  • 绝了!这款工具让SpringBoot不再需要Controller、Service、DAO、Mapper!

  • 一个注解搞定 SpringBoot 接口防刷,还有谁不会?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

关于UUID的二三事相关推荐

  1. cocos2d Labels and Fonts 标签和字体(附:关于Hiero的二三事)

    Labels and Fonts 标签和字体 Introduction 介绍 cocos2d 支持 TTF (True Type Fonts) 标签和纹理 atlas 标签. Pros and Con ...

  2. 缓存架构设计细节二三事

    缓存架构设计细节二三事 原创 2016-03-08 58沈剑 架构师之路 本文主要讨论这么几个问题: (1)"缓存与数据库"需求缘起 (2)"淘汰缓存"还是&q ...

  3. python输入y继续运行_Python二三事 - 接触Python(x,y)

    注释:本文原来转自博客大巴的一篇文章,向原作者致谢!我也做了相应的修改,更加完善对于Pythonx,y的介绍 Python 二三事 面向初学者介绍Python相关的一些工具,以及可能遇到的常见问题. ...

  4. WinForm二三事(一)消息循环

    在进入正文之前,想请大家先欣赏下面两段代码: 1: //这是一个控制台程序,请先添加System.Windows.Form.dll的引用 2: using System.Windows.Form; 3 ...

  5. 【见闻录系列】我所理解的搜索业务二三事

    [见闻录系列]我所理解的搜索业务二三事 FexianXu 20220730 at Baidu Search Team 前言 之前笔者在博文[1]中谈到了在工作一年的过程中,笔者对"业务&qu ...

  6. dva处理_关于dva框架的二三事

    关于dva框架的二三事 发布时间:2018-06-24 15:31, 浏览次数:618 , 标签: dva 前言 我开通了一个微信公共号"王和阳的航海日志",在上面记录着自己的学习 ...

  7. 计算机的二三事——软件篇

    计算机的二三事--软件篇 写在前面 第一部分 操作系统 1.1 操作系统(OS) Windows MacOS Linux 1.2 操作系统的架构(x86(32位)/x64(64位)/arm(64位)) ...

  8. 单身程序员上班路上二三事(一)

    单身程序员上班路上二三事(一) 公交车上,前面和中间那部分在早高峰总是人满为患的.我挤到最后一排靠窗座的邻座,这是我最爱的位置. 下一站,上来一个身材高挑,头发乌黑笔直的Female,虽戴着口罩,但眉 ...

  9. 红蓝对抗场景下的二三事

    背景 未知攻焉知防,警察想要抓小偷,就该先摸透小偷的想法,才能更快捷的抓到小偷毕竟小偷抓小偷更容易.网络安全的攻与防,好比"矛"与"盾",要想不被"矛 ...

最新文章

  1. 国内大陆芯片70个细分领域重要代表企业!
  2. 【django】配置文件
  3. boost::contract模块实现overload的测试程序
  4. c语言 读取一个文件 删除注释,C/C++ 源文件删除注释代码
  5. Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】
  6. Laravel数据库迁移和填充(支持中文)
  7. 很多人喜欢露脚踝你觉得时尚吗?
  8. 判断手机机型和浏览器内核
  9. 使用Python实现电子邮件群发功能
  10. [Java] 蓝桥杯ALGO-125 算法训练 王、后传说
  11. sql server 查询数据库所有的表名+字段
  12. R-CNN、Fast R-CNN、Faster R-CNN算法对比
  13. 学习数据库的概念,作用
  14. Cts框架解析(19)-设备状态的分类以及恢复模式的分类
  15. 【工商银行科技菁英计划笔试】压缩字符串
  16. 利用c语言编写一个时钟计时器(c语言基础练习)
  17. OpenSSL BIO 自我扫盲
  18. Node-RED教程(十五):工业仪表盘开发
  19. 关于线程中断thread interrupt
  20. android 脚本引擎,autojs脚本引擎实现的安卓手机发短信源码

热门文章

  1. python模块之json,pickle
  2. JavaScript夯实基础系列(四):原型
  3. Spring 学习笔记
  4. 定制简单的Linux系统
  5. Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】
  6. 2017 .NET 開發者須知
  7. NEFU 1146 又见A+B
  8. ASP.NET全球化与本地化 c#多国语言的支持 (项目支持多国语言的开发)
  9. CS研究笔记-缓存 (转)
  10. 细化 Sobel 边缘提取