编程语言
首页 > 编程语言> > java – 如何基于唯一整数获得唯一的字母数字

java – 如何基于唯一整数获得唯一的字母数字

作者:互联网

我的webapplication在数据库中有一个表,其中id列对于每一行始终是唯一的.除此之外,我想要另一个名为代码的列,它将具有6位唯一的字母数字代码,数字0-9和字母A-Z.字母和数字可以在代码中重复.即FFQ77J.我知道这个6位字母数字代码的唯一性随着时间的推移而减少,因为添加了更多行但是现在我对此感到满意.

要求(更新)
  – 代码应至少为6长
  – 每个代码应为字母数字

所以我想生成这个字母数字代码.

有什么好办法呢?

>我应该生成代码并在生成之后,对数据库运行查询并检查它是否已经存在,如果是,那么生成一个新的?为了确保唯一性,这段代码是否需要同步,以便只有一个线程运行它?
>数据库中是否有内置功能可以让我这样做?

对于这一代,我将使用我在this answer年看到的这样的东西

char[] symbols = new char[36];
char[] buf;
    for (int idx = 0; idx < 10; ++idx)
        symbols[idx] = (char) ('0' + idx);
    for (int idx = 10; idx < 36; ++idx)
        symbols[idx] = (char) ('A' + idx - 10);
public String nextString()
{
    for (int idx = 0; idx < buf.length; ++idx)
        buf[idx] = symbols[random.nextInt(symbols.length)];
    return new String(buf);
}

解决方法:

由于要求短代码无法猜测,因此您不希望将其与您的uniqueID行ID绑定.否则,这意味着除了unique之外,你的rowID必须是随机的.从计数器0开始,并递增,使得代码为:000001,000002,000003等时非常明显.

对于您的短代码,生成一个随机的32位int,省略符号并转换为base36.拨打您的数据库,以确保它可用.

您尚未明确提出可扩展性,但我认为了解设计的局限性非常重要.

在2 ^ 31个可能的6个char base36值,您将在~65k行中发生​​冲突(参见Birthday Paradox questions)

从您的评论中,修改您的代码:

public String nextString()
{
    return Integer.toString(random.nextInt(),36);
}

标签:java,algorithm,uniqueidentifier
来源: https://codeday.me/bug/20190725/1533815.html