Сгенерировать пароль из буквенно-цифровых символов в JavaScript

#javascript #html #alphanumeric

#javascript #HTML #буквенно — цифровой #буквенно-цифровой

Вопрос:

Я хочу сгенерировать случайный пароль с буквенно-цифровыми символами в нем. Я написал функцию, которая возвращает случайный пароль с буквенно-цифровыми символами. Но я хочу добавить только 4 буквенно-цифровых символа из предоставленной строки. Отредактировано: Я знаю, что это не лучшее решение, но мне удалось получить желаемый результат, если кто-то хотел бы получить доступ к коду и оптимизировать его, тогда это было бы действительно полезно.

 function getRandomPassword(length, numberOfNonAlphaNumericChars) {
const passwordDigit = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP1234567890";
const alphaNumericChar = "!@#$%^amp;*()_- =[{]};:>|./?";
var temp1 = "";
var temp2 = "";
var pass = "";
if(length < 1 || length > 128) {
console.log("Number Exceeds");
}
if(numberOfNonAlphaNumericChars > length || numberOfNonAlphaNumericChars < 0) {
console.log("Error");
}
  for(var i = 0; i < length; i  ) {
        var x = Math.floor(Math.random() * length);
    temp1  = passwordDigit.charAt(x);
    }
  for(var j = 0; j < numberOfNonAlphaNumericChars; j  ) {
    var alphaNumericCharPos = Math.floor(Math.random() * numberOfNonAlphaNumericChars);
    temp2  = alphaNumericChar.charAt(alphaNumericCharPos);
  }
    
  var newPass = [temp1.slice(0, x), temp2, temp1.slice(x)].join('');
    
  console.log(newPass);
  return newPass;
}
getRandomPassword(16, 4);  

jsfiddle: (https://jsfiddle.net/37rjgfad/11 /)

Комментарии:

1. Можете ли вы предоставить фрагмент, который вызывает код, и что вы ожидаете, что он вернет? Спасибо

2. Я не понимаю этого требования: «Но я хочу добавить только 4 буквенно-цифровых символа из предоставленной строки». В вашем примере вы запрашиваете 16 символов: вы имеете в виду, что хотите, чтобы по крайней мере 12 из них были не буквенно-цифровыми, то есть из вашей строки символов? Как насчет randomString(16, '#aA') того, где символы вообще не нужны?

3. Вы можете увидеть фрагмент на jsfiddle. В настоящее время он возвращает 16-значный случайный пароль. Но я хочу, чтобы в пароль были включены только 4 буквенно-цифровых символа, например: abcAbCdEkJpT $ * ^amp;

4. Ваш пример abcAbCdEkJpT $*^amp; содержит 12 буквенно-цифровых символов и 4 символа (буквенно-цифровые = буквы и цифры). Вы имели в виду 4 не буквенно-цифровых символа?

5. Поскольку вы не инициализируете x вне цикла, это поместит все четыре символа в начало строки, и вы поддерживаете только размещение четырех из них рядом друг с другом.

Ответ №1:

Это даст вам ровно 4 не буквенно-цифровых символа:

 function jumble(str) {
  return [...str]
    .sort(() => Math.random() - 0.5)
    .join('')
}

// no change to this function
function randomString(length, chars) {
    var mask = '';
    if (chars.indexOf('a') > -1) mask  = 'abcdefghijklmnopqrstuvwxyz';
    if (chars.indexOf('A') > -1) mask  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    if (chars.indexOf('#') > -1) mask  = '0123456789';
    if (chars.indexOf('!') > -1) mask  = '!@#$%^amp;*()_- =[{]};:>|./?';
    var result = '';
    for (var i = length; i > 0; --i) result  = mask[Math.round(Math.random() * (mask.length - 1))];
    return resu<
}

console.log(
  jumble(randomString(12, 'aA#')   randomString(4, '!'))
)  

Измените по мере необходимости, если вы хотите другой дистрибутив. Например:

 jumble(
  randomString(4, 'a')
    randomString(4, 'A')
    randomString(4, '!')
    randomString(4, '#')
)
  

Даст вам 16-символьную строку, содержащую ровно 4 символа каждого типа, или:

 jumble(randomString(12, '!')   randomString(4, 'aA#'))
  

Даст вам 12 не буквенно-цифровых символов и 4 буквенно-цифровых символа.

Комментарии:

1. Хотелось бы знать, почему это было отклонено, учитывая, что он отвечает на вопрос точно так, как в примере OP?

2. Я обновил вопрос, код не является лучшим решением, но довел до состояния, позволяющего получить желаемый результат. Если вы можете помочь в оптимизации кода, то это было бы действительно полезно.

3. Все еще не ясно, чего вы хотите. Вы хотите, чтобы 4 не алфавитно-цифровых символа всегда отображались рядом друг с другом? Кроме того, что нужно «оптимизировать» в вашем коде?

4. Я хочу, чтобы в строке в случайном положении присутствовали только 4 буквенно-цифровых символа.

5. Основываясь на этом описании, этот ответ уже решает вашу проблему.

Ответ №2:

Вы можете уменьшить буквенно-цифровую строку, из которой вы выбираете символы, всего до 4 символов.

 function randomString(length, chars) {
  var mask = '', result = '';
  if (chars.indexOf('a') > -1) mask  = 'abcdefghijklmnopqrstuvwxyz';
  if (chars.indexOf('A') > -1) mask  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  if (chars.indexOf('#') > -1) mask  = '0123456789';
  for(var i = 0; i < 4; i  ) {
    result  = mask[Math.floor(Math.random() * mask.length)];
  }
  mask = '';
  if (chars.indexOf('!') > -1) {
    mask  = '!@#$%^amp;*()_- =[{]};:>|./?';
  }
  for (var i = 0; i < length - 4; i  ) {
    result  = mask[Math.floor(Math.random() * mask.length)];
  }
  return resu<
}

console.log(randomString(16, 'aA#!'));
console.log(randomString(16, '#aA'));
console.log(randomString(16, '#A!'));  

Второй вызов функции возвращает неопределенный результат после первых 4 символов, поскольку пароль ограничен 4 буквенно-цифровыми символами, а символы не разрешены.

Обратите внимание, что, вызывая document.write() , вы сначала удаляете документ, а затем добавляете новый текст. Вы сможете увидеть только текст, который вы написали последним. Следовательно, я использовал console.log() .

Комментарии:

1. Буквенно-цифровой код охватывает все abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ и 0123456789, а не только набор строчных букв. И я не думаю, что требованием являются «отдельные символы». Но в любом случае я думаю, что фактическим требованием является «не более 4 не буквенно-цифровых символов» из примера OP в комментариях.

2. Это было не для того, что я просил. Фактически это замена 4-го индекса буквенно-цифровыми символами.

3. Тогда чего именно вы хотите?

4. @WaisKamal Я обновил вопрос, код не является лучшим решением, но довел до состояния, позволяющего получить желаемый результат. Если вы можете помочь в оптимизации кода, то это было бы действительно полезно.

5. Это именно то, что вы просите в вопросе: только 4 буквенно-цифровых символа в пароле.