许多答案(包括这个答案的原件)都没有解决 OP 的字母和数字计数要求。以下是两种解决方案:通用(无最小字母/数字)和规则。
一般的:
我相信这是比上面更好的通用解决方案,因为:
- 它比接受/最高投票的答案更安全,也更通用,因为它以区分大小写的方式支持任何字符集
- 它比其他答案更简洁(对于一般解决方案,最多 3 行;可以是单行)
- 它仅使用本机 Javascript-无需安装或其他库
注意
- 这对IE浏览器,在Array.fill()原型必须polyfilled
- 如果可用,最好使用 window.crypto.getRandomValues() 而不是 Math.random() (感谢 @BenjaminH 指出)
三线:
var pwdChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var pwdLen = 10;
var randPassword = Array(pwdLen).fill(pwdChars).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');
或者,作为单线:
var randPassword = Array(10).fill("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz").map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('');
使用字母/数字规则
现在,上述的变化。这将从给定的字符集(字母、数字或任一)生成三个随机字符串,然后对结果进行打乱。
请注意,以下使用 sort() 仅用于说明目的。对于生产用途,请将以下 sort() 函数替换为诸如Durstenfeld 之类的随机播放函数。
首先,作为一个函数:
function randPassword(letters, numbers, either) {
var chars = [
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", // letters
"0123456789", // numbers
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" // either
];
return [letters, numbers, either].map(function(len, i) {
return Array(len).fill(chars[i]).map(function(x) {
return x[Math.floor(Math.random() * x.length)];
}).join('');
}).concat().join('').split('').sort(function(){
return 0.5-Math.random();
}).join('')
}
// invoke like so: randPassword(5,3,2);
同样的事情,作为一个 2-liner(诚然,非常长和丑陋的线条——如果你使用适当的 shuffle 函数,它不会是一个 1-liner。不推荐,但有时它仍然很有趣):
var chars = ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz","0123456789", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"];
var randPwd = [5,3,2].map(function(len, i) { return Array(len).fill(chars[i]).map(function(x) { return x[Math.floor(Math.random() * x.length)] }).join('') }).concat().join('').split('').sort(function(){return 0.5-Math.random()}).join('');