2010-12-09 43 views
1

我试图生成非重复字母数字代码的列表。它们将以批量和批量生成,使得明确查看之前生成的内容是不可行的 - 即独特性需要以某种方式得到保证,而无需借助当前批次之外的先前代码。生成字母数字代码的非重复列表

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

我可能会实现这个在Java中,但我会很感激任何算法或技巧任何人都可以解决这一想到...

问候,

+1

只有有限数量的8个字符的组合 - 很明显,他们会在一段时间后重复*。 – casablanca 2010-12-09 15:16:33

+1

请参阅http://stackoverflow.com/tags/license-key/faq – 2010-12-09 15:18:32

回答

4

就拿System.currentTimeMillis的对其进行编码通过将每个数字映射到一个字母来进行字母数字化。跟踪发布的最后一个(在同一毫秒内重复监视多代)并相应处理。

2

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

编辑:当然,这需要你记住你最后生成的代码,并进行这一个资料片跨批次。

3

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

AtomicInteger counter = new AtomicInteger(); 

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

这会给你04十亿唯一的ID。

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

0

8个嵌套循环可以轻松解决您的问题。 此外,如果你想要的话,你可以使用随机生成下一个令牌并将所有令牌存储在Set中。每当你得到新的令牌时,检查它是否已经被设置。

0

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

无论如何,如果你想确保你的代码是唯一的,你可以在一些代码字符中编码生成日期,以确保它不会与先前的代码发生冲突。

例如,你的代码将有形式YMDXXXXX,其中:

  • Y是自2010年(从0开始,当你在2020年跑出的数字开始使用字母)
  • M是当月(相同标准)
  • D是当天(不会大于31,因此字符0-9A-Z应该足够)
  • X是您当前批生成的代码。
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个字符

而且我的程序并不知道大,小写字母的区别。如果你需要,那么应用程序将会更复杂,因为我们需要一个数组而不是一个长数字。