Пишем программу на JavaScript для формирования случайных 20-значных комбинаций из латинских букв, цифр и спецсимволов. На выбор 60 вариантов — 4 столбца по 15 строк. Первый символ — всегда буква, все символы в каждой комбинации идут без повторов. Будем формировать пароли для вёб-сайтов в браузере.
Используем символы в диапазоне от !
до ~
и их десятичные коды от 33
до 126
.
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 :
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
; < = > ? @ A B C D E F G H I J K L M N O P Q R S T
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
l m n o p q r s t u v w x y z { | } ~
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
Три вложенных цикла: по строкам, по колонкам и по комбинациям. Получаем случайное число — код символа в
диапазоне [33-126]
, затем проверяем на соответствие условиям и добавляем в комбинацию. Первый символ
— буква, все символы в каждой комбинации идут без повторов. Экранируем символы &
, >
и <
для
корректного отображения в браузере. Собираем 15 строк, в каждой строке по 4 комбинации.
'use strict';
// формирование комбинаций
const generate = function() {
let text = "";
for (let row = 0; row < 15; row++) {
let line = "";
for (let col = 0; col < 4; col++) {
let combo = "";
for (let len = 0; len < 20; len = combo.length) {
const co = random("!".charCodeAt(0), "~".charCodeAt(0));
const ch = String.fromCharCode(co);
if (len == 0 && (ch >= "A" && ch <= "Z" || ch >= "a" && ch <= "z")
|| len > 0 && combo.indexOf(ch) < 0)
combo += ch;
}
line += escapeHTML(combo) + " ";
}
text += line + (row < 14 ? "\n" : "");
}
return text;
}
// получение случайного числа в заданном диапазоне
const random = (min, max) => Math.round(min + (max-min) * Math.random());
// экранирование спецсимволов HTML для корректного отображения в браузере
const escapeHTML = (str) => str.replace("&", "&").replace(">", ">").replace("<", "<");
// кнопка обновить на странице — обновляем комбинации
const refresh = () => document.getElementById("combinations").innerHTML = generate();
// после загрузки всех частей страницы — обновляем комбинации
document.addEventListener("DOMContentLoaded", refresh);
Давно пользуюсь этим алгоритмом — у меня все пароли для вёб-сайтов по этой схеме сгенерированы, поэтому рекомендую. Первая версия была написана на Java, но для вёб-сайтов проще получается на JavaScript, чтобы далеко не ходить.
© Головин Г.Г., Код с комментариями, 2023