🌐全局唯一ID生成方案
type
Post
status
Published
date
Aug 19, 2024
slug
GenID
summary
category
技术分享
tags
全局唯一ID
笔记
icon
password
AI summary
Blocked by
Blocking
Category
uuid
是什么
uuid的全称是 universally unique identifier ,即通用唯一识别号,它由16字节(128byte)组成,可以用于唯一的标识信息。
格式为 8-4-4-4-12的16进制格式
使用
- 分隔不同的UUID版本
1. UUID v1 (基于时间)
UUID v1 是基于时间戳生成的,并使用了机器的MAC地址来保证唯一性。其结构如下:
- 前 60 位表示时间戳,单位是100纳秒(从1582年10月15日以来的时间)。
- 13 位表示时钟序列,用来防止同一时间生成多个UUID时产生冲突。
- 剩下的 48 位为节点标识符,通常为设备的 MAC 地址。
由于包含MAC地址,因此UUID v1可能会暴露硬件信息。
2. UUID v2 (DCE 安全)
UUID v2 类似于 v1,但根据用户的本地标识(如UID或GID)和时间戳生成。这种UUID较少使用。
3. UUID v3 (基于命名空间的散列)
UUID v3 使用命名空间和用户指定的名称生成。它基于MD5哈希算法,即根据命名空间和名称的MD5哈希值生成唯一标识符。此版本可以确保同一名称在同一命名空间下生成的UUID始终相同。
命名空间有四种标准类型:
DNS:基于域名系统
URL:基于URL
OID:基于对象标识符
X.500 DN:基于X.500目录名
4. UUID v4 (随机生成)
UUID v4 是目前最常用的版本,使用随机数生成器生成UUID。其128位中的122位是随机生成的,剩余6位用于版本信息和其他元数据。这使得v4版本的UUID具有较高的随机性和唯一性。
生成UUID v4的关键是使用高质量的随机数生成器,保证足够的随机性。
5. UUID v5 (基于命名空间的散列)
UUID v5 类似于 v3,但它使用的是SHA-1哈希算法而不是MD5,因此具有更高的安全性。和v3一样,v5生成的UUID对于相同的命名空间和名称也会一致。
使用场景
- 文件、资源的唯一标识
- 会话标识符
- 分布式系统中的标识符:微服务架构中生成全局唯一的请求 ID、事务 ID、任务 ID 等。
- 消息队列中的信息ID
雪花算法
是什么
雪花算法生成的ID通常是一个64位的整数,它的位结构如下:
- 第一段1位未使用,永远固定为0,因为ID为正数
- 第二段41位,为毫秒级时间(41位的长度可以使用69年)
- 第三段10位,为workID(10位的长度最多能部署1024个节点)
- 第四段为12位,表示每毫秒内的计数(12位的计数顺序号支持每个节点每毫秒支持产生4096个ID序号)
按照 1024个节点计算:每毫秒可以生成的ID序列号有 1024*4096=4194304,足以满足绝大多数业务场景
- 获取当前时间戳:计算当前时间与纪元时间的差值,以毫秒为单位。
- 生成ID:
- 将时间戳左移(41位),数据中心ID左移(5位),机器ID左移(5位),并将序列号添加到最低位。
- 组合所有部分,生成一个64位的整数ID。
雪花算法存在的问题
SnowFlake强依赖 时间戳,所以时间的变动会造成SnowFlake的算法产生错误;使用时需要注意时钟回拨的现象
具体实现
Prev
sqlite内存模式下的性能测试
Next
linux笔记
Loading...