title: UUID是什么?
tags: UUID
categories: Java基础
UUID
由来
每个个体都是独一无二的存在
- 指纹信息:与生俱来的独有印记。
- 身份证号码:你的唯一标识,世界给你的独有编码。
- 世界的秩序、个体间的沟通交流,都离不开独一无二的你。
分布式系统中,每个元素也都是独一无二的存在
- 分布式系统需要建立秩序。(有序的)
- 分布式系统中的元素需要沟通交流。(互动的)
- 所以,分布式系统中的所有元素都需要唯一的辨识信息。(唯一标识)
- 并且,我们希望这个唯一的辨识信息是”指纹信息“,而不是”身份证号码“。(自发的)
- 因为,”身份证号码“需要有中央控制端来统一管控,相比之下,还是与生俱来方便一些。(自发的)
- 那么,如何设定与生俱来的指纹信息?(唯一的,自发的)
能力
- UUID:Universally Unique Identifier(通用唯一识别码)
- UUID可以让分布式系统中的元素具有唯一性和自发性。
- 兼顾时间和空间,你可以自发拥有属于自己的唯一标识,之后畅游分布式系统的世界尽享欢乐时光,激不激动,刺不刺激!
- 那么,如何保证自发性和唯一性?
实现
- UUID是16字节128位长的数字,通常以36字节的字符串表示。
- 示例:3F1504E0-6F89-11D3-9A0C-0905E82C3306
编码规则
- 1~8位:采用系统时间,精确到毫秒。(时间唯一性)
- 9~16位:采用底层IP地址。(服务集群唯一性)
- 17~24位:当前对象HashCode值。(内部对象唯一性)
- 25~32位:随机数。(一个对象内毫秒级唯一性)
对比
- UUID具有多个版本(方式)去实现。
基于时间的UUID:当前时间戳+随机数+机器MAC地址
- 使用MAC地址好处:全球范围唯一。劣势是:安全性问题。
- 如果应用在局域网使用,可以退而求其次,用IP地址代替MAC地址。(Java的UUID往往是这样实现)
基于名字的UUID:MD5(计算机名字+名字空间)散列值
- 缺点是计算机名字和名字空间都相同的情况会重复。
随机数UUID:根据随机数生成UUID
- 但有极小概率导致重复。
应用
- 消息系统发送消息的唯一标识码。
总结
- 人们的思维方式源于生活,无论是现实世界还是虚拟世界,都离不开独一无二的你我。