生成非重复的字母数字代码列表

时间:2010-12-09 15:12:16

标签: java algorithm

我正在尝试生成非重复字母数字代码列表。它们将分批和批量生成,以便明确查看之前生成的内容是不可行的 - 即,无需借助当前批次之外的先前代码,就可以某种方式保证唯一性。

代码的长度应为8个字符,但约束条件是某些字符不能出现在代码中(例如l和L),因为用户将在以后重新输入这些字符。

我可能会在Java中实现这一点,但我很欣赏任何人都可以想到解决这个问题的算法或技巧......

此致

7 个答案:

答案 0 :(得分:4)

只需使用System.currentTimeMillis并通过将每个数字映射到一个字母来按字母数字编码。跟踪发布的最后一个(以相同的毫秒保护多代)并相应处理。

答案 1 :(得分:3)

你可以只编码一个原子计数器,如

AtomicInteger counter = new AtomicInteger();

public String generateId() {
   return Integer.toHexString(counter.getAndIncrement());
}

这将为您提供40亿个唯一ID。

如果您需要超过40亿,您可以使用AtomicLong并根据您想要允许的字符使用您自己的编码。

答案 2 :(得分:2)

所述问题具有明显的解决方案,即从零开始顺序生成代码。将每个代码视为base-34中的数字(除0-9A-Z之外的数字为IL。如果这不是你想要的,你可能想澄清这个问题(例如,你想要随机性吗?)

编辑:这当然要求您记住您生成的最后一个代码,并在批次中传递这一条信息。

答案 3 :(得分:0)

8个嵌套循环可以轻松解决您的问题。 此外,如果您需要,您可以使用Random生成下一个令牌并在Set中存储所有令牌。每次获得新令牌时都要检查它是否已经设置好。

答案 4 :(得分:0)

太糟糕了,你被限制在8个字符以内。否则,您可以使用MD5类生成唯一代码。

无论如何,如果您想确保您的代码是唯一的,您可以使用某些代码字符对生成日期进行编码,以确保它不会与以前的代码冲突。

例如,您的代码的格式为YMDXXXXX,其中:

  • Y是自2010年以来的一年(从0开始,到2020年用完数字时开始使用字母)
  • M是月份(相同标准)
  • D是当天(不会大于31,所以字符0-9A-Z应该足够了)
  • X是您当前批次生成的代码。

答案 5 :(得分:0)

你可以像这样迭身吗?

000000a1 000000a2 000000a3 ... 000000ay 000000az 000000b0

然后记住最后一个数字,所有未来的数字都将大于最后一个数字

你可能会发现这个有用的

long l = 20492;
String s = "wogjz";
s = Long.toString(l, 26+10-2).replace('I','Y').replace('L','Z') // convert long number to string (with letters)
l = Long.parseLong(s.replace('Y','I').replace('Z','L'), 26+10-2) + 1) // Convert string to number

数字26 + 10-2是字母数加上数字数减去禁止字母数(I和L)。 I / Y和Z / L转换是与Java库一起使用字母表的最后一个字母。

您需要确保用户不会自己输入I或L,因为我的代码无法正常工作。

您需要在字符串中添加前导零,直到它达到8个字符

我的程序也不知道大字母和小字母之间的区别。如果你需要那么应用程序必须更复杂,因为我们需要一个数组而不只是一个长数字。

答案 6 :(得分:0)

检查此逻辑。您可以循环排除任何字母或数字。对于“ L”问题,可以排除以下情况

        if(brokenCode[i] == 'K') brokenCode[i] = 'L'; 
        brokenCode[i] = (char)(((int)brokenCode[i]) + 1);

示例代码

class Rextester
{  
    public static void main(String args[])
    {
        String currCode = "00000000";
        for(int i=0; i<2000; i++)
        {
            System.out.println(currCode);
            currCode = getNextCode(currCode);
        }
    }

    private static String getNextCode(String currCode)
    {
        char [] brokenCode;
        brokenCode = currCode.toCharArray();
        for(int i=brokenCode.length-1; i>= 0; i--)
        {
            if(brokenCode[i] == '9')
            {
                brokenCode[i] = 'A';
                break;
            }
            if(brokenCode[i] == 'Z'){
                brokenCode[i] = '0';
                continue;
            }
            brokenCode[i] = (char)(((int)brokenCode[i]) + 1);
            break;
        }
        currCode = new String(brokenCode);
        return currCode;
    }

}