public String generator(String tele){
//利用哈希值生成验证码
int hash =tele.hashCode();
//加密
int encryption= 2020666;
//用hash异或上加密得到生成第一次加密结果
//这个生成的加过永远是固定的如果加密码不动的情况下
long result= hash ^ encryption;
//利用获得当前时间再次加密得出结果
long time = System.currentTimeMillis();
result=result^time;
//取后六位
long code= result % 1000000;
//此时随机验证码生成完成
return code+"";
}
首先我们传入一个手机号字符串tele,获取它的哈希值,在通过加密,用哈希值异或上加密我们就可以得到第一个加密的结果了,但是我们此时我们生成的验证码是不变的因为我们的加密值是一直不变的,然后在现实生活中我们的验证码是动态变化的这是如何做到的呢?
其实要做到生成动态的验证码并不难,我们只要让我们上次得到的验证码再和一个动态变化的数据进行加密即可。
此时我们最容易想到的就是时间。因此我们可以通过这串代码
long time = System.currentTimeMillis();
result=result^time;
得到这个这个动态生成的验证码,然后对验证码进行取余就可以得到一个六位数的验证码了。
但此时你以为就结束了吗?
我们上述的代码会出现两个bug
当你在多次运行这串代码时你会发现验证码还会出现负数的形式,显然这不符合我们的实际生活
下面我们就来解决这个bug
其实也特别简单,我们只要进行一个判断就可以了
这里我们可以运用三目表达式进行正负值的判断
code=code<0? -code:code;
好了到这个如果按照我的代码运行还会发现,会出现验证码小于六位数的,出现这种错误并不是我们的代码出现错误,而是生成的验证码出现了000787,002323,000001这种情况
此时我们就要运用一些数据结构相关的知识和一点小算法
//解决思路利用数据结构的算法,利用数组,将得到的验证码长度作为数组的角码,在拼接字符就可以完成补零
//先把得到的验证码变成字符串
String codeStr=code+"";
//再把code的字符长度取出,作为数组的角标
int len=codeStr.length();
String[] patch ={"000000","00000","0000","000","00","0",""};
//验证有多少为需要补
String patch1 = patch[len];
return patch1+codeStr;
好了到这里我们基本完成了手机号验证码的生成。
完整代码给你
public String generator(String tele){
//利用哈希值生成验证码
int hash =tele.hashCode();
//加密
int encryption= 2020666;
//用hash异或上加密得到生成第一次加密结果
//这个生成的加过永远是固定的如果加密码不动的情况下
long result= hash ^ encryption;
//利用获得当前时间再次加密得出结果
long time = System.currentTimeMillis();
result=result^time;
//取后六位
long code= result % 1000000;
//此时随机验证码生成完成
//此时会出现生成的验证码为负值,利用三目表达式进行解决
code=code<0? -code:code;
//此时还会出现第二个问题当生成000656这种只会显示656不会补零所以我们现在要解决当位数不够在前补零
//解决思路利用数据结构的算法,利用数组,将得到的验证码长度作为数组的角码,在拼接字符就可以完成补零
//先把得到的验证码变成字符串
String codeStr=code+"";
//再把code的字符长度取出,作为数组的角标
int len=codeStr.length();
String[] patch ={"000000","00000","0000","000","00","0",""};
//验证有多少为需要补
String patch1 = patch[len];
return patch1+codeStr;
}
在接下来的文章中我会就如何利用缓存实现验证码的生成和校验的功能;
如果感兴趣可以关注我,同时也可以和我进行交流。