我正在尝试生成非重复字母数字代码列表。它们将分批和批量生成,以便明确查看之前生成的内容是不可行的 - 即,无需借助当前批次之外的先前代码,就可以某种方式保证唯一性。
代码的长度应为8个字符,但约束条件是某些字符不能出现在代码中(例如l和L),因为用户将在以后重新输入这些字符。
我可能会在Java中实现这一点,但我很欣赏任何人都可以想到解决这个问题的算法或技巧......
此致
答案 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-9
和A-Z
之外的数字为I
和L
。如果这不是你想要的,你可能想澄清这个问题(例如,你想要随机性吗?)
编辑:这当然要求您记住您生成的最后一个代码,并在批次中传递这一条信息。
答案 3 :(得分:0)
8个嵌套循环可以轻松解决您的问题。 此外,如果您需要,您可以使用Random生成下一个令牌并在Set中存储所有令牌。每次获得新令牌时都要检查它是否已经设置好。
答案 4 :(得分:0)
太糟糕了,你被限制在8个字符以内。否则,您可以使用MD5类生成唯一代码。
无论如何,如果您想确保您的代码是唯一的,您可以使用某些代码字符对生成日期进行编码,以确保它不会与以前的代码冲突。
例如,您的代码的格式为YMDXXXXX
,其中:
0-9A-Z
应该足够了)答案 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;
}
}