问题
随机字符串最常见的用法作密码生成器,网上有很多相关文章。但我的需求有点特殊:这个生成器应该是本地的,免安装的,很少依赖的,可定制的,也可远程的。这样就排除了需要安装的app,依赖于网络及第三方的小程序或其他网络应用。

解决方案
javascript会是一个比较好的选择,只要嵌入进html文件中,就可以通过浏览器调用,实现本地化,免安装,很少依赖性。而通过地址栏的的url参数,实现可定制。而如果部署到网络空间上,可以远程调用。

首先我们需要随机生成一个数字,Math.random()*m 生成一个0~m的随机数,然后用这个随机数索引出一个随机字符。

可见字符的ascii码为33到126,以下取得随机字符的方法相当优雅:
String.fromCharCode(33 + Math.floor(Math.random()*(126-33)))
但因特殊字符分散在数字,大写字母,小写字母之间,并不连贯,要实现可定制比较费事。

解决之道是,先定制一个字符母串strs,用strs[Math.floor(Math.random()*strs.length]取得随机字符。以下是代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function randstr(args='snul8'){
//s:special character特殊字符
//n:number数字
//u:upper case大写字母
//l:lower case小写字母
//数字8用作控制生成随机字符的长度,也可以是其他数字
//默认参数snul8,生成8位随机字符串,包含特殊字符,数字和大小写字母

var special = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';//有些特殊字符如'和\要加\转义
var number = '0123456789';
var lower = 'abcdefghijklmnopqrstuvwxyz';
var upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var strs = '';//用作母串载体
var str = '';//用作随机字串载体

var num= args.replace(/[^0-9]/ig,"");//取得args中的数字,作密码长度
if(args.search("s")!=-1){//如果args中有s,母串中含有特殊字符
strs += special;
}
if(args.search("n")!=-1){//如果args中有n,母串中含有数字
strs += number;
}
if(args.search("u")!=-1){//如果args中有u,母串中含有大写字母
strs += upper;
}
if(args.search("l")!=-1){//如果args中有l,母串中含有小写字母
strs += lower;
}

var len = strs.length;
for (i=0; i<num; i++){
j = Math.floor(Math.random()*len);
str += strs[j]
}

return str;

}

str = randstr('l6un');
console.log(str);
alert(str);

随机字符生成器

讨论

至此,我们已经实现了一个随机字符生成器,但要作为一个密码器使用,还是得完善一些东西。在某些浏览器上弹出窗口可能不能被复制,而很多移动终端并没有控制台,所以得将字符串写入网页中去。更进一步的,在网页还需要一键复制的按钮,以及远程保存的按钮。而如果涉及保存的话,还得实现加密,因为保存原始密码并不安全也不推荐。