如何使用JavaScript生成首字符不为-、_、0的随机密码
问题描述
我是JavaScript初学者,目前编写了如下随机密码生成函数,可生成长度为15位、包含大小写英文字母、数字、-、_字符的随机密码,现在需要修改代码,实现**生成的密码首字符不能为-、_、0**的需求。
原有代码如下:
function randomPassword() { let length = 15, password = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_", space = ""; for (let i = 0, mu = password.length; i < length; ++i) { space += password.charAt(Math.random() * mu) } return space; } console.log(randomPassword());
修改思路
- 拆分两个字符集:一个是排除了
-、_、0的首字符专用字符集,另一个是原有全量字符集,用于密码除首字符外的其余位置 - 优先生成首字符,从首字符专用字符集中随机取值,从根源上避免首字符出现非法字符
- 剩余14位密码从全量字符集中随机取值,保留原有密码的字符范围规则
- 补充
Math.floor()对随机数做取整处理:原代码直接传入浮点数给charAt虽然JS会做隐式转换,但显式取整逻辑更严谨,不会出现边界索引异常
修改后完整代码
function randomPassword() { const totalLength = 15; // 全量可用字符:覆盖大小写字母、数字、-、_,用于非首字符位置 const allValidChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; // 首字符可用字符:排除了-、_、0 const firstValidChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; let generatedPwd = ""; // 生成合法首字符 generatedPwd += firstValidChars.charAt(Math.floor(Math.random() * firstValidChars.length)); // 生成剩余14位字符 for (let i = 1; i < totalLength; i++) { generatedPwd += allValidChars.charAt(Math.floor(Math.random() * allValidChars.length)); } return generatedPwd; } console.log(randomPassword());
注:不推荐「生成完整密码后判断首字符非法就重新生成」的实现方式,这种方案会产生无意义的重试开销,拆分字符集的方案一次生成即可符合规则,执行效率更高,逻辑也更直观。
内容的提问来源于stack exchange,提问作者NickNameNeeded
相关产品推荐
相关产品推荐

