PHP生成一个随机数验证码,需要什么特殊计算方法吗?
纯讨论问题。
比如生成一个4位数字或者六位数字的短信验证码,可以直接mt_rand(1000,9999)来生成吗?
或者如字母+数字的图像验证码。我看了一些开源框架的随机生成方法,都有比较复杂的方法。
网上搜索的方法,大部分都是超简单的方式。
网上的简单方法和开源框架的复杂方法,都有什么利弊呢?
if ($this->minLength > $this->maxLength) {
$this->maxLength = $this->minLength;
}
if ($this->minLength < 3) {
$this->minLength = 3;
}
if ($this->maxLength > 20) {
$this->maxLength = 20;
}
$length = mt_rand($this->minLength, $this->maxLength);
$letters = 'bcdfghjklmnpqrstvwxyz';
$vowels = 'aeiou';
$code = '';
for ($i = 0; $i < $length; ++$i) {
if ($i % 2 && mt_rand(0, 10) > 2 || !($i % 2) && mt_rand(0, 10) > 9) {
$code .= $vowels[mt_rand(0, 4)];
} else {
$code .= $letters[mt_rand(0, 20)];
}
}
return $code;
上面是摘抄的yii2的生成方法,for循环里面的这个if$i % 2 && mt_rand(0, 10) > 2 || !($i % 2) && mt_rand(0, 10) > 9
是什么意思?为什么是对2取余,>2,>9什么的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
框架里面使用的复杂方法,只是增加了随机次数。
程序使用的核心随机函数决定了产生伪随机数的优劣,业务逻辑的复杂起不到优化随机数产生器的性能,
所以说简单和复杂只是业务层面的,或者是程序员设计的算法逻辑复杂。
在PHP中,
rand()使用线性同余算法产生随机数的周期为2^32
mt_rand()使用Mersenne Twister算法周期长达2^19937−1, 弥补了rand()周期性和熵池不足的缺点
但是rand()和mt_rand()产生的随机数都不安全
所以php7新增了函数random_int(),random_bytes(),openssl_random_pseudo_bytes()用来产生加密安全的伪随机数。
注意一点,php7.1.0中,rand()和mt_rand()使用了相同的随机数发生器。
复杂了完全没有意义,用户体验一点都不好,随机4为数字后台生成我觉得挺好。
mt_rand就行了,如果是移动端,我输个验证码还要数字键盘和字母键盘来回切。。
验证码主要是识别难度,不能太难,也不能太容易被机器算出来,生成什么并不难,随机与否也不是问题。
验证码是和手机号,绑定去验证的。所以例子中说手机的验证码唯一,不具代表性。
其实就是随机算法问题,你当然可以使用rand或者mt_rand这些。你也可以使用更加复杂的rand算法来实现。