我有一个用例,需要生成6位字母数字的唯一标识符。遇到了许多解决方案,但在多处理器环境中似乎都失败了,而且可能在某个时间点生成相同的唯一标识符。
是否有任何解决方案/算法可以在多处理器环境中的运行时生成6位字母数字的唯一标识符,并且应该始终生成唯一标识符。
对于保证全局唯一的I'd来说,六个字母数字字符太少了。如果这是您的要求,那么最好的办法可能是在全局变量中保留一个计数器,在需要时返回base64编码的值作为下一个值,并原子性地增加计数器。
如果您需要在不同的机器上工作,请将计数器输出到数据库(序列)中。您可以为每个服务器分配范围,以避免每次生成新的I'd时都进行数据库查询。
一个从0
开始并按1
递增的简单数字序列将生成一个不重复的序列(显然在末尾或超过6位数时停止)。在基数36
中生成数字,该数字为字母数字。
要使其可并发访问,您只需要将序列生成器放在Runnable
中,并在提供BlockingQueue
的线程中运行它。然后,您可以以线程安全的方式从队列中提取数字。类似这样的东西:
class SafeSequence implements Runnable {
// My current value.
long i = 0;
// Use BlockingQueue to assist cuncurrency.
BlockingQueue<Long> q = new ArrayBlockingQueue<>(10);
String get() throws InterruptedException {
// Format at take time.
return Long.toString(q.take(), 36);
}
@Override
public void run() {
try {
while (true) {
// Always runs in it's own thread so no concurrency issues.
q.put(i++);
}
} catch (InterruptedException ie) {
// Just drops out of the loop on iterruption.
}
}
}
如果你不想要序列,你可以使用LFSR来生成序列。
您考虑过commons id吗?您可能对UUID版本1的某些变体感兴趣,不过提供的标准UUID为128位长。