mysql 生成唯一自增id 订单号_唯一ID生成算法剖析,看看这篇就够了

本文转载自腾讯技术工程

在业务开发中,大量场景需要唯一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生成规则:

  • 版本1 - 基于时间的UUID:主要依赖当前的时间戳及机器mac地址,因此可以保证全球唯一性

  • 版本2 - 分布式安全的UUID:将版本1的时间戳前四位换为POSIX的UID或GID,很少使用

  • 版本3 - 基于名字空间的UUID(MD5版):基于指定的名字空间/名字生成MD5散

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值