繁体   English   中英

为什么我用 JavaScript 编写的密码生成器经常返回带有重复字符的密码?

[英]Why does my password generator written in JavaScript often return passwords with repeating characters?

我写了一个 JavaScript class 和四个 static 变量,包含最终密码可能包含的不同种类的字符。 class 包含四个 getter 函数,它们从这四个变量返回一个随机字符。 在单独的 function 中,我尝试创建密码。 不幸的是,最终密码似乎并不包含完全随机的字符。 通常重复相同的字符。

我仔细查看了我的随机函数,但它似乎没问题。 我希望您知道为什么密码最终如此相似,例如 AAAh^8 或 bSS+5S

class Password{
    
    static lowerCase = "abcdefghijklmnopqrstuvwxyz";
    static upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static numbers   = "0123456789";
    static symbols   = "!@#$%^&*()_+~\\`|}{[]:;?><,./-=";

    length = document.getElementById("passwordLength").value;

    getKey = [this.upperCase, this.lowerCase, this.num, this.symbol]

    get upperCase(){
        return Password.upperCase[Math.floor(Math.random() * Password.upperCase.length)]
        }
    get lowerCase(){
        return Password.lowerCase[Math.floor(Math.random() * Password.lowerCase.length)]
    }
    get num(){
        return Password.numbers[Math.floor(Math.random() * Password.numbers.length)]
    }
    get symbol(){
        return Password.symbols[Math.floor(Math.random() * Password.symbols.length)]
    }
    password = ""
}

function createPassword(){
    const newPass = new Password;
     
    for (var i=0; i<newPass.length; i++){
        key = newPass.getKey[Math.floor(Math.random() * newPass.getKey.length)]
        newPass.password += key
        console.log("Random Key Run " + i + ": " + key)
    }
    console.log("Final Password: " + newPass.password)
}
createPassword()

正如@deceze 所说,您实际上是在getKey初始值设定项中预先选择了 4 个不同的字符。

如果你不那么喜欢吸气剂,你可能会有更好的时间,例如

function pick(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

class PasswordGenerator {
  static lowerCase = "abcdefghijklmnopqrstuvwxyz";
  static upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  static numbers = "0123456789";
  static symbols = "!@#$%^&*()_+~\\`|}{[]:;?><,./-=";
  static classes = [
    PasswordGenerator.lowerCase,
    PasswordGenerator.upperCase,
    PasswordGenerator.numbers,
    PasswordGenerator.symbols,
  ];

  getChar() {
    const cls = pick(PasswordGenerator.classes);
    return pick(cls);
  }
}

function createPassword() {
  const generator = new PasswordGenerator();
  let password = "";
  for (var i = 0; i < 8; i++) {
    const key = generator.getChar();
    password += key;
    console.log(`Random Key Run ${i}: ${key}`);
  }
  console.log("Final Password: " + password);
}

createPassword();

我还冒昧地将不一定是Password state 的内容从PasswordGenerator生成器 class 中移出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM