PHP生成一个随机数验证码,需要什么特殊计算方法吗?

发布于 2022-09-05 15:38:17 字数 1150 浏览 40 评论 0

纯讨论问题。
比如生成一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

两个我 2022-09-12 15:38:17

框架里面使用的复杂方法,只是增加了随机次数。

程序使用的核心随机函数决定了产生伪随机数的优劣,业务逻辑的复杂起不到优化随机数产生器的性能,

所以说简单和复杂只是业务层面的,或者是程序员设计的算法逻辑复杂。

在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()使用了相同的随机数发生器。

空袭的梦i 2022-09-12 15:38:17

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

各空 2022-09-12 15:38:17

mt_rand就行了,如果是移动端,我输个验证码还要数字键盘和字母键盘来回切。。

懒的傷心 2022-09-12 15:38:17

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

樱花落人离去 2022-09-12 15:38:17

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

千寻… 2022-09-12 15:38:17

其实就是随机算法问题,你当然可以使用rand或者mt_rand这些。你也可以使用更加复杂的rand算法来实现。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文