純討論問題。比如生成一個4位數(shù)字或者六位數(shù)字的短信驗(yàn)證碼,可以直接mt_rand(1000,9999)來生成嗎?或者如字母+數(shù)字的圖像驗(yàn)證碼。我看了一些開源框架的隨機(jī)生成方法,都有比較復(fù)雜的方法。網(wǎng)上搜索的方法,大部分都是超簡單的方式。
網(wǎng)上的簡單方法和開源框架的復(fù)雜方法,都有什么利弊呢?
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循環(huán)里面的這個if$i % 2 && mt_rand(0, 10) > 2 || !($i % 2) && mt_rand(0, 10) > 9是什么意思?為什么是對2取余,>2,>9什么的?
6 回答

飲歌長嘯
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個贊
復(fù)雜了完全沒有意義,用戶體驗(yàn)一點(diǎn)都不好,隨機(jī)4為數(shù)字后臺生成我覺得挺好。

莫回?zé)o
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個贊
驗(yàn)證碼主要是識別難度,不能太難,也不能太容易被機(jī)器算出來,生成什么并不難,隨機(jī)與否也不是問題。

手掌心
TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個贊
驗(yàn)證碼是和手機(jī)號,綁定去驗(yàn)證的。所以例子中說手機(jī)的驗(yàn)證碼唯一,不具代表性。

烙印99
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊
其實(shí)就是隨機(jī)算法問題,你當(dāng)然可以使用rand或者mt_rand這些。你也可以使用更加復(fù)雜的rand算法來實(shí)現(xiàn)。
- 6 回答
- 0 關(guān)注
- 852 瀏覽
添加回答
舉報
0/150
提交
取消