我想创建一个函数,该函数将为我提供固定大小的 6 字符字母数字 ID,并要求第一个和最后一个字符必须是 alpha。
我希望它们按顺序生成。我认为使用 base36 将是使用 [0-9A-Z] 字母表的方法,但是我不太确定如何确保它们始终为 6 个字符长,并且在开头和结尾处带有 alpha。
例如,如果我按顺序创建 ID 并从 0 开始,我将得到 0 作为输出,因为 0 在两个基中都是相同的。
有谁知道可以在这里提供帮助的有效算法?
谢谢
我想创建一个函数,该函数将为我提供固定大小的 6 字符字母数字 ID,并要求第一个和最后一个字符必须是 alpha。
我希望它们按顺序生成。我认为使用 base36 将是使用 [0-9A-Z] 字母表的方法,但是我不太确定如何确保它们始终为 6 个字符长,并且在开头和结尾处带有 alpha。
例如,如果我按顺序创建 ID 并从 0 开始,我将得到 0 作为输出,因为 0 在两个基中都是相同的。
有谁知道可以在这里提供帮助的有效算法?
谢谢
您可以使用标准算法从 int 转换为 base36 字符串,通过取基数的模,然后将余数除以基数,一次提取一个数字,但为第一个和最后一个数字添加一个特殊情况:
例如在 Java 中:
static String getId(int id)
{
String s = "";
for(int i = 0; i < 6; i++)
{
// compute the digit using modulo arithmetic using base 26
// for first and last character and base 36 for others
int digit;
if((i == 0) || (i == 5))
{
digit = (id % 26) + 10;
id /= 26;
}
else
{
digit = id % 36;
id /= 36;
}
// add the digit to the string:
if(digit < 10)
s = (char)('0' + digit) + s;
else
s = (char)('A' + (digit - 10)) + s;
}
return s;
}
有 26*36*36*36*36*26 = 1135420416 种可能性,这意味着您只需要一个 32 位整数来存储它们。