在多进程设置中生成6位字母数字唯一标识符的任何算法/逻辑



我有一个用例,需要生成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位长。

最新更新