UUID的方式能生成一串惟一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。UUID的底层是由一组32位数的16进制数字构成,是故 UUID 理论上的总数为,约等于
html
,也就是说若每纳秒产生1百万个 UUID,要花100亿年才会将全部 UUID 用完(100亿年啊,地球都没了),因此这足够咱们的使用了,也可以保证惟一性。java
UUID 的十六个八位字节被表示为 32个十六进制数字,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)。例如:mysql
123e4567-e89b-12d3-a456-426655440000 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
上面的以数字 M开头的四位表示 UUID 版本,目前UUID的规范有5个版本,M可选值为1, 2, 3, 4, 5 ;各个版本的具体介绍以下所示:算法
version 1:0001。基于时间和 MAC 地址。因为使用了 MAC 地址,所以可以确保惟一性,可是同时也暴露了 MAC 地址,私密性不够好。
version 2:0010。DCE 安全的 UUID。该版本在规范中并无仔细说明,所以并无具体的实现。
version 3:0011。基于名字空间 (MD5)。用户指定一个名字空间和一个字符串,经过 MD5 散列,生成 UUID。字符串自己须要是惟一的。
version 4:0100。基于随机数。虽然是基于随机数,可是重复的可能性能够忽略不计,所以该版本也是被常用的版本。
version 5:0101。基于名字空间 (SHA1)。跟 Version 3 相似,可是散列函数编程了 SHA1。sql
上面以数字 N开头的四个位表示 UUID 变体( variant ),变体是为了能兼容过去的 UUID,以及应对将来的变化,目前已知的变体有以下几种,由于目前正在使用的 UUID 都是 variant1,因此取值只能是 8,9,a,b 中的一个(分别对应1000,1001,1010,1011)。数据库
variant 0:0xxx。为了向后兼容预留。
variant 1:10xx。当前正在使用的。
variant 2:11xx。为早期微软 GUID 预留。
variant 3:111x。为未来扩展预留。目前暂未使用。编程
Java已经写好一个UUID类供咱们使用,以下所示segmentfault
package com.one.util; import java.util.UUID; public class Test { public static void main(String[] args) { String uuid= UUID.randomUUID().toString().replace("-", "").toLowerCase(); System.out.println("UUID的值是:"+uuid); } }
结果以下所示安全
UUID的值是:24e6f66b3dfb4aba8e3e3801d3327e08
若是需求是只保证惟一性,那么UUID也是可使用的,可是按照上面的分布式id的要求, UUID实际上是不能作成分布式id的,缘由以下:dom
- 首先分布式id通常都会做为主键,可是安装mysql官方推荐主键要尽可能越短越好,UUID每个都很长,因此不是很推荐
- 既然分布式id是主键,而后主键是包含索引的,而后mysql的索引是经过b+树来实现的,每一次新的UUID数据的插入,为了查询的优化,都会对索引底层的b+树进行修改,由于UUID数据是无序的,因此每一次UUID数据的插入都会对主键地城的b+树进行很大的修改,这一点很很差
- 信息不安全:基于MAC地址生成UUID的算法可能会形成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制做者位置。
好比阿里云每一条短信发送的惟一id,这个是能够的,好比从阿里云官网截图所示:
看到这里的同窗,以为好的话就帮忙推荐下吧,Thanks♪(・ω・)ノ
其余分布式ID系列快捷键:
分布式ID系列(1)——为何须要分布式ID以及分布式ID的业务需求
分布式ID系列(2)——UUID适合作分布式ID吗
分布式ID系列(3)——数据库自增ID机制适合作分布式ID吗
分布式ID系列(4)——Redis集群实现的分布式ID适合作分布式ID吗
大佬网址:
https://tech.meituan.com/2017/04/21/mt-leaf.html
http://www.javashuo.com/article/p-onzgjbbx-kr.html
https://www.jianshu.com/p/9d7ebe37215e
https://www.jianshu.com/p/da6dae36c290