@Kipsi

Как сделать генератор кодов?

Здравствуйте. Подскажите пожалуйста как можно реализовать подобное на чистом js. Есть поле ввода например input и кнопка. Я ввожу в инпуте число кодов (например 10 штук) которое нужно сгенерировать и нажимаю кнопку и в массив arr запушиваются коды созданные случайно в формате 25DF-2FS4-GT2S с использованием англ букв и цифр(без знаков и символов). И при каждой новой генерации нужно проверить массив что бы не было совпадений с ранее созданными и добавленными кодами.
  • Вопрос задан
  • 611 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
Как-то так. UPD: провел тесты, и переделал логику «сборки» итогового значения.
const createKeyGenerator = (groupSize, groupCount) => {
    const dictionary = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    const length = groupSize * groupCount;

    return () => {
        const values = new Uint32Array(length);
        crypto.getRandomValues(values);

        const chars = [...values].map(value => dictionary[value % dictionary.length]);
        const key = new Array(groupCount)
            .fill(null)
            .map((_, index) => {
                const offset = index * groupSize;

                return chars
                    .slice(offset, offset + groupSize)
                    .join('');
            })
            .join('-');

        return key;
    };
};

const createKey = createKeyGenerator(4, 3);

console.log(createKey()); // FO4V-P2ZV-JYH4
console.log(createKey()); // TTMR-EBVC-8TUW

Также, по-хорошему если данные коды будут хранится в БД, неплохо бы на существование проверять.
Предыдущая версия

const createKeyGenerator = (groupSize, groupCount) => {
    const dictionary = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    const length = groupSize * groupCount;
    const group = new RegExp(`.{${groupSize}}`, 'g');

    return () => {
        const values = new Uint32Array(length);
        crypto.getRandomValues(values);

        const chars = [...values].map(value => dictionary[value % dictionary.length]);
        const key = '_'
            .repeat(length)
            .replace(/\w/g, (match, index) => chars[index])
            .match(group)
            .join('-');

        return key;
    };
};



Хочу заметить: не могу гарантировать 100%, что алгоритм будет устойчивым (без повторов). Проверял на Set коллекции, по итогу размер коллекции превысил (16^6 значений) и получил исключение. При этом не было ни одного повтора.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы