
在分布式系统中,常常需要生成唯一的 traceID 用来跟踪一次用户请求的调用链。
系统之前一直使用的是 UUID,由于 UUID 是 32 位,比较长,而且不携带任何业务相关信息。除了唯一好像基本没其它优点。
于是想着有没有一种更好的 ID 生成方式?
思路:
- 使用 62 进制格式,可充分利用数字和字母大小写组合,压缩效率高,又避免 64 进制出现的两个特殊字符在传输过程中可能出现的问题。
- 使用随机数 + 时间戳的组合方式,固定生成 10 位。
- 前七位使用精确到毫秒的时间戳,转成 62 进制方式。7 位的 62 进制可以使用到 2080 年,基本足够用了。
- 后三位使用随机数填充,碰撞概率为:1/238327。
优点:
- 生成的串比较短,只有 10 位。
- 理论上,在一毫秒内重复的概率为:1/238327,已经非常小了。
附 Java 版实现源码:
1 | import java.security.SecureRandom; |