互联网中,我们经常在登录一些网站和App时能看到一些验证码,有那么这些是怎么实现的呢?接下来,以下图的验证码为例:
思路
不同字母所在的的ASCII码分布不同
大写字母的ASCII码分布在65~90
小写字母的ASCII码分布在97~122
数字0-9的ASCII码分布在48~57(本案例未添加数字)
此外,如果想生成图形化效果,可以通过Java画笔工具实现,稍后有时间我会更新
/** * 返回英文验证码(包含大小写) * @param len 期望的验证码长度 * @return 返回验证码 */ public static String createCode(int len,int m){ StringBuilder result=new StringBuilder(); char[] words=new char[len]; for (int i = 0; i < len; i++) { int code=0; //大小写字母都有出现的概率 if((int)(Math.random()*i%2)==0)//得到大写字母 code=(int)(Math.random()*26+65); else//得到小写字母 code=(int)(Math.random()*26+97); words[i]=(char)code; } //随机打乱顺序 shuffle(words); for(char word:words){ result.append(word); } return String.valueOf(result); } //随机打乱的方法 public static void shuffle(char[] words){ for (int i = 0; i < words.length; i++) {//随机生成范围在(0~数组长度)的数字rand,并递归与第i个字符进行交换 int rand=(int)(Math.random()*words.length); swap(i,rand,words); } } //交换数组的方法 public static void swap(int i,int j,char[] words){ char temp=words[i]; words[i]=words[j]; words[j]=temp; }
调用四次该方法,查看效果(大写字母的概率比小写字母的要大,未优化)