如何生成全局唯一的id?

为什么要生成唯一ID?

在开发过程中,我们有时候一些业务场景需要生成一个唯一的id,比如在商城下单的适合,我们要给订单生成一个唯一的id,再比如,我们使用分布式数据库的适合,我们需要保证全局的id是唯一的,那么这时候要保证我们数据的唯一性

接下来看看两种常见的生成唯一id的方法

生成唯一ID的方法

UUID

首先来看第一种,UUID。UUID是获取唯一id的另一种简单方法。UUID是一个128位的数字,用于识别计算机系统中的信息。UUID发生碰撞的可能性很低。引用维基百科的话,“在大约100年里每秒生成10亿个uuid后,创建一个重复的概率将达到50%”[1]。

UUID的一个例子:09c93e62-50b4-468d-bf8a-c07e1040bfb2。uuid可以独立生成,而不需要服务器之间的协调。图7-3显示了UUIDs的设计。

UUID特点

1.128bit、字符串、无序

snowflake/雪花算法

雪花算法是由Twitter推出,是一个64位纯数字标识符

在分布式数据库生成全局id中,雪花算法常常被推荐使用

每个部分的解释如下

•符号位:1位。它将始终是0。这是留给将来使用的。它可以被用于区分有符号数字和无符号数字。

•时间戳(timestamp):41位。从这个时代或自定义时代开始的毫秒。

•数据中心ID(datacenter ID):5位,这给了我们2个^5=32个数据中心。

•机器ID(machine ID):5位,每个数据中心有2台^5=32台机器。

•序列号(sequence number):12位。对于在该机器/进程上生成的每个ID,序列号将增加1。该数字被重置为每毫秒间隔0次。 2^12=4096组合。此字段为0,除非在同一服务器上在毫秒内生成多个ID。理论上,一台机器每毫秒最多可以支持4096个新id。

snowflake的特点

1.64bit、纯数字、有序

2.理论上一台机器每毫秒最多支持4096个新id

snowflake存在的问题

时钟回拔:服务器时钟回拨时可能会生成重复 id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

社区开源库

GitHub - bwmarrin/snowflake: A simple to use Go (golang) package to generate or parse Twitter snowflake IDsGitHub - satori/go.uuid: UUID package for Go

GitHub - google/uuid: Go package for UUIDs based on RFC 4122 and DCE 1.1: Authentication and Security Services.

Reference materials

1.《system design interview》


版权声明:本文为qq_37186127原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。