工作中经常会有生成唯一字符串的需求。通常最容易想到的是UUID。UUID的唯一性毋庸置疑,但是32位的长度也容易让人退避三舍。也曾经想过参考《短网址生成方案》来生成一串ID,但是试验了一下发现唯一性不太好。
最终采用的方案是时钟方案,简单来说就是用当前时间戳做唯一ID。
采用时间戳做ID,秒或毫秒都容易产生重复,换成纳秒在单节点上就没问题了。参考百度百科关于纳秒的描述就能清楚为什么纳秒级别的时间戳不会产生重复:
光在真空中一纳秒仅传播0.3米。个人电脑的微处理器执行一道指令(如将两数相加)约需2至4纳秒。
我们生成一条唯一ID所需的CPU指令绝不止一道,因此用纳秒作单机唯一ID是绰绰有余的。在测试中发现,即使是千分之一纳秒也足够我们在PC机上生成唯一ID了。
至于长度:对原始值做一次Base62处理,长度就能缩减到令人满意的程度。
不多废话,直接上代码:
public static synchronized String gen() {
StringBuilder builder = new StringBuilder(System.nanoTime() / 1000 + “”);
if (SEQ.incrementAndGet() % 10 == 0) {
SEQ.incrementAndGet();
}
builder.appe
版权声明:本文为weixin_31572175原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。