![640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/489300ab7c42ed5d59dae7ac243424de.gif)
引
在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识;商品需要唯一标识;消息需要唯一标识;事件需要唯一标识…等等,都需要全局唯一ID,尤其是分布式场景下。
唯一ID有哪些特性或者说要求呢?按照我的分析有以下特性:
-
唯一性:生成的ID全局唯一,在特定范围内冲突概率极小
-
有序性:生成的ID按某种规则有序,便于数据库插入及排序
-
可用性:可保证高并发下的可用性
-
自主性:分布式环境下不依赖中心认证即可自行生成ID
-
安全性:不暴露系统和业务的信息
一般来说,常用的唯一ID生成方法有这些:
UUID:
-
基于时间戳&时钟序列生成
-
基于名字空间/名字的散列值 (MD5/SHA1) 生成
-
基于随机数生成
数据库自增ID:
-
多台机器不同初始值、同步长自增
-
批量缓存自增ID
雪花算法
-
时钟回拨解决方案
-
本文便分别对这些算法进行讲解及分析。
UUID
UUID全称为:Universally Unique IDentifier(通用唯一识别码),有的地方也称作GUID(Globally Unique IDentifier),实际上GUID指微软对于UUID标准的实现的实现。
UUID算法的目的是为了生成某种形式的全局唯一ID来标识系统中的任一元素,尤其在分布式环境下,该ID需要不依赖中心认证即可自动生成全局唯一ID。
其优势有:
-
无需网络,单机自行生成
-
速度快,QPS高(支持100ns级并发)
-
各语言均有相应实现库供直接使用
而缺点为:
-
String存储,占空间,DB查询及索引效率低
-
无序,可读性差
-
根据实现方式不同可能泄露信息
1.UUID的格式
UUID的标准形式为32个十六进制数组成的字符串,且分隔为五个部分,如:
467e8542-2275-4163-95d6-7adc205580a9
各部分的数字个数为:8-4-4-4-12
2.UUID版本
根据需要不同,标准提供了不同的UUID版本以供使用,分别对应于不同的UUID生成规则: