Создание последовательной базы с фиксированным размером 36 идентификаторов

Я хочу создать функцию, которая будет давать мне фиксированный размер 6-значный буквенно-цифровой идентификатор с требованием, чтобы первый и последний символ был альфа.

Я хочу, чтобы они генерировались последовательно. Я думаю, что использование base36 было бы подходящим способом для алфавита [0-9A-Z], однако я не слишком уверен, как обеспечить, чтобы они всегда были длиной 6 символов с альфа в начале и в конце.

Например, если бы я создал идентификаторы последовательно и начал с 0, я бы получил 0 для вывода, так как 0 одинаково в обеих базах.

Кто-нибудь знает эффективный алгоритм, который может помочь здесь?

Спасибо

1 ответ

Решение

Вы можете использовать стандартный алгоритм для преобразования из 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-разрядное целое число, чтобы сохранить их все.

Другие вопросы по тегам