什么是UUID?
UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:

经由一定的算法机器生成

为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。

非人工指定,非人工识别

UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。

在特定的范围内重复的可能性极小

UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
UUID是16字节128位长的数字,通常以36字节的字符串表示,示例如下:
3F2504E0-4F89-11D3-9A0C-0305E82C3301
其中的字母是16进制表示,大小写无关。
GUID(Globally Unique Identifier)是UUID的别名;但在实际应用中,GUID通常是指微软实现的UUID。
UUID的版本
UUID具有多个版本,每个版本的算法不同,应用范围也不同。
首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
00000000-0000-0000-0000-000000000000
UUID Version 1:基于时间的UUID
基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。
UUID Version 2:DCE安全的UUID
DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
UUID Version 4:随机UUID
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
UUID的应用
从UUID的不同版本可以看出,Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下;至于Version 4,我个人的建议是最好不用(虽然它是最简单最方便的)。
通常我们建议使用UUID来标识对象或持久化数据,但以下情况最好不使用UUID:

映射类型的对象。比如只有代码及名称的代码表。
人工维护的非系统生成对象。比如系统中的部分基础数据。

对于具有名称不可重复的自然特性的对象,最好使用Version 3/5的UUID。比如系统中的用户。如果用户的UUID是Version 1的,如果你不小心删除了再重建用户,你会发现人还是那个人,用户已经不是那个用户了。(虽然标记为删除状态也是一种解决方案,但会带来实现上的复杂性。)
UUID生成器
我没想着有人看完了这篇文章就去自己实现一个UUID生成器,所以前面的内容并不涉及算法的细节。下面是一些可用的Java UUID生成器:

Java UUID Generator (JUG):开源UUID生成器,LGPL协议,支持MAC地址。
UUID:特殊的License,有源码。
Java 5以上版本中自带的UUID生成器:好像只能生成Version 3/4的UUID。

     System.out.println(UUID.nameUUIDFromBytes("sfsfs".getBytes()));//版本3System.out.println(UUID.randomUUID());//版本4

此外,Hibernate中也有一个UUID生成器,但是,生成的不是任何一个(规范)版本的UUID,强烈不建议使用。
延伸阅读
UUID规范:rfc4122
DCE 1.1中的UUID

什么是UUID 以及UUID的版本相关推荐

  1. 从零开发短视频电商 UUID的5个版本和缩短长度

    文章目录 定义 格式 版本 V1 时间+MAC地址 V2 时间+MAC地址 DCE安全版本 V3 V5 基于名字空间名称 V4 随机UUID UUID缩短长度 定义 UUID是由一个16进制下的32位 ...

  2. 什么是uuid以及uuid在java中的使用

    什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...

  3. java获取UUID与UUID的校验

    背景: 我们在开发的过程中可能需要随机生成一个ID,例如数据库中的某个ID 有时候也要对其进行校验. UUID: UUID,是Universally Unique Identifier的缩写,UUID ...

  4. uuid hashcode_Java UUID hashCode()方法与示例

    uuid hashcode UUID类hashCode()方法 (UUID Class hashCode() method) hashCode() method is available in jav ...

  5. golang not enough arguments in call to uuid.Must have (uuid.UUID) want (uuid.UUID, error)

    golang not enough arguments in call to uuid.Must have (uuid.UUID) want (uuid.UUID, error) 相信出现此问题的都是 ...

  6. android u盘 uuid,(已解决)root device uuid is 'UUID'

    问题描述 镜像使用七月流火的安装在UEFI+GPT环境下 使用原镜像自带的Clover可以引导启动安装, 并且安装好之后也可以引导进入系统. 安装好系统之后,仍然使用U盘中自带的Clover也可以引导 ...

  7. svn重新定位提示版本库uuid不匹配

    svn"重新定位"提示版本库 uuid不匹配: 版本库 "https://127.0.0.1:444/svn/Mir" 的 uuid是 "d52648 ...

  8. 版本库重新定位时svn uuid不一致问题

    提示 Repository uuid '62b86956-73d9-2945-ba87-0546d71898f9' doesn't match expected uuid '6aed1349-fe9f ...

  9. Python 标准库之 uuid

    1. uuid 介绍 UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的 UUID 它可以保证在空间和时间上的唯一性.它是通过 MAC 地址.时 ...

最新文章

  1. RSS FEED的应用
  2. 进行面向对象设计时,就一个类而言,应该仅有一个引起它变化 的原因,这属于()设计原则。【最全!最详细解析!】
  3. halcon通过点拟合圆形,鼠标选点
  4. ABP框架 v3.0 已发布!
  5. Java对象垃圾回收调用,JVM垃圾回收之哪些对象可以被回收
  6. 开源mes系统_如何让iMES系统快速落地变得so easy?
  7. Binary Tree Paths
  8. Lesson2.2 2.3 Maya command reference quick help
  9. 分布式系统关注点——99%的人都能看懂的「熔断」以及最佳实践
  10. 免费题库CISP,NISP,SCSA,SCSP,CISA,CISSP,CISP-PTE
  11. 面试65个问题教你怎么机智回答面试官及回答技巧
  12. dex2jar android,dex2jar
  13. 应届生实习需要注意哪些方面?
  14. 三个mplayer播放器mplayer mpv mplayer-ww
  15. java 307跳转_GitHub - yy307/java-weixinlib: 微信公众平台接入
  16. Qt 图像放大缩小拖动
  17. SolidPlant材料清单
  18. 百度网盘加速无限试用_百度网盘上线 单日/单次 加速功能,最低仅需 2 块钱
  19. EDMA 和QDMA
  20. 迈德威视相机C#调用例程

热门文章

  1. 在apache中开启deflate方法的总结
  2. 干货分享:常见的测试类型有哪些?
  3. MMD初尝试1(骨骼系统)
  4. 【2020年高被引学者】 王威廉 加州大学圣塔芭芭拉分校
  5. 大锅菜机器人_天津农学院现“炒菜机器人” 做番茄炒蛋堪比大师傅
  6. 树莓派3B+如何完成对产品的升级改造
  7. 发布一套类似于网易ITOWN,基于脚本开发的休闲游戏系统
  8. GCN:图卷积神经网络
  9. linux svn 查看忽略文件,SVN忽略文件或文件夹几种方法总结linux操作系统 -电脑资料...
  10. GStreamer - On Windows