猿问

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什么的?

BIG阳
浏览 830回答 6
6回答

饮歌长啸

复杂了完全没有意义,用户体验一点都不好,随机4为数字后台生成我觉得挺好。

莫回无

验证码主要是识别难度,不能太难,也不能太容易被机器算出来,生成什么并不难,随机与否也不是问题。

手掌心

验证码是和手机号,绑定去验证的。所以例子中说手机的验证码唯一,不具代表性。

烙印99

其实就是随机算法问题,你当然可以使用rand或者mt_rand这些。你也可以使用更加复杂的rand算法来实现。
随时随地看视频慕课网APP
我要回答