JavaScript生成含大小写数字符号密码脚本偶缺数字问题及演示请求
随机密码生成脚本问题分析与修复
原脚本存在的问题
- 纯随机字符抽取逻辑没有强制复杂度校验规则,所有字符完全随机组合,概率上会出现16次抽取都未命中数字段的情况,即你遇到的偶发无数字问题
- 原有代码存在索引越界隐性bug:
Math.floor(Math.random() * str.length + 1)生成的索引最大值等于字符池长度,而字符串索引从0开始,str.charAt(字符池长度)会返回空字符串,可能导致部分密码混入空值
修复后的代码
修复逻辑为:先强制抽取至少1位数字、1位大写字母、1位小写字母、1位特殊符号,剩余位数再从全字符池随机抽取,最后打乱整体顺序避免固定位规律:
function generateP() { // 拆分不同类型字符池 const upperStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const lowerStr = 'abcdefghijklmnopqrstuvwxyz'; const numStr = '1234567890'; const symbolStr = '!@#$%^&()_+~`|}{[]:;?><,./-='; const allStr = upperStr + lowerStr + numStr + symbolStr; const passLength = 16; let pass = []; // 各类型至少取1位,保证符合复杂度要求 pass.push(upperStr[Math.floor(Math.random() * upperStr.length)]); pass.push(lowerStr[Math.floor(Math.random() * lowerStr.length)]); pass.push(numStr[Math.floor(Math.random() * numStr.length)]); pass.push(symbolStr[Math.floor(Math.random() * symbolStr.length)]); // 剩余位数从全字符池随机取 for (let i = 4; i < passLength; i++) { pass.push(allStr[Math.floor(Math.random() * allStr.length)]); } // 打乱数组顺序,避免前4位固定类型的规律 pass = pass.sort(() => Math.random() - 0.5); return pass.join(''); } console.log(generateP())
内容的提问来源于stack exchange,提问作者Aab B
相关产品推荐
相关产品推荐

