如何在C++中生成非UUID类型的短全局唯一ID
C++ 短全局唯一ID实现方案
这类更短的全局唯一ID核心逻辑都是通过拼接时间戳、节点/进程标识、序列号/随机数的组合,再使用比十六进制更紧凑的编码方式(如Base62、Base58)压缩字符串长度,C++生态有很多对应的实现方案,也可以快速自研适配业务需求:
自研实现
可以根据自身业务的唯一性要求灵活调整各字段位宽,典型的64位ID结构可以参考:- 41位毫秒级时间戳(可覆盖约70年的时间范围)
- 10位节点/机器标识(可支持1024个节点部署)
- 12位同毫秒内序列号(单节点每毫秒可生成4096个ID)
最终生成的64位整数转Base62编码后仅11位字符串,长度远小于36位的标准UUID。如果不需要分布式部署,还可以裁剪节点位宽,进一步压缩总长度。
成熟开源实现
不想自研可以直接用现成的稳定库:snowflake-cpp:雪花算法的C++实现,原生输出64位整数,适合分布式有序ID场景,转字符串后最长19位,编码为Base62仅11位ulid-cpp:实现ULID标准,固定26位字符长度,按时间有序,可读性和唯一性平衡较好,比UUID短10位xid-cpp:完全对齐Go生态XID实现,12字节原始内容编码后为20位字符串,跨语言兼容性好nanoid-cpp:对齐Go生态NanoID实现,支持自定义ID长度和字符集,默认长度21位,低并发场景下可缩短到6~8位使用
选择方案时如果需要ID按生成时间排序,优先选择带时间戳前缀的有序方案(雪花ID、ULID、XID);如果只需要唯一、无序,优先选NanoID,灵活度更高。
内容的提问来源于stack exchange,提问作者user3472
相关产品推荐
相关产品推荐

