加密生成指定长度_3分钟短文 | PHP伪随机Token生成器,实地测试,效果感人!
引言
我們經(jīng)常可能會(huì)用到邀請(qǐng)碼,郵件驗(yàn)證碼,或者需要使用unique 字符串標(biāo)記用戶屬性的情況。
今天我們且不說高深的“全局唯一ID”的生成方案,我們說一個(gè)簡(jiǎn)單的,如何生成一個(gè)唯一的,隨機(jī)的,數(shù)組字母組成的字符串。
學(xué)習(xí)時(shí)間
PHP 有一個(gè)內(nèi)置函數(shù) uniqid,用于生成一個(gè)唯一的ID。該函數(shù)結(jié)構(gòu)形式:
string uniqid([ string $prefix = ""[, bool $more_entropy = false]] )用于獲取一個(gè)帶前綴、基于當(dāng)前時(shí)間微秒數(shù)的唯一ID。
但是該方法所生成的ID并不是安全的,且依賴于本機(jī)的時(shí)間戳,有可能在同一微秒生成同一ID。所以安全起見,需要添加上 prefix 參數(shù),以示區(qū)別。
more_entropy 參數(shù)使生成的ID更具有唯一性,如果設(shè)置為 TRUE,uniqid() 會(huì)在返回的字符串結(jié)尾增加額外的煽(使用combined linear congruential generator)。
這就夠了嗎?這當(dāng)然不是最優(yōu)的解決方法。我們嘗試其他解決方案。使用 openssl 帶來的加密性和唯一性。
bin2hex(openssl_random_pseudo_bytes($bytes))使用 openssl_random_pseudo_bytes 函數(shù)生成一個(gè)偽隨機(jī)字符串的字節(jié),然后使用 bin2hex 將其格式化為十六進(jìn)制的字符串。
生成的偽隨機(jī)字節(jié),其字節(jié)數(shù)由length參數(shù)確定。還指示是否使用了加密功能強(qiáng)的算法來生成偽隨機(jī)字節(jié),并通過可選的crypto_strongparameter來執(zhí)行此操作。 此種方法返回的參數(shù),很少情況下會(huì)出現(xiàn)false。
美中不足的是,這樣生成的數(shù)字字符串,只在[0-9][a-z]之間,不夠廣泛。我們嘗試加固這個(gè)生成方法,增強(qiáng)其魯棒性。
上述函數(shù)會(huì)生成一個(gè)區(qū)間位于 [$min, $max] 的隨機(jī)數(shù)字。然后調(diào)用該函數(shù)生成指定長度的字符串。
函數(shù) crypto_rand_secure 函數(shù)的實(shí)現(xiàn)方法,在PHP標(biāo)準(zhǔn)函數(shù)中,可以使用 rand / mt_rand 函數(shù)替代。
在PHP 7 中,系統(tǒng)提供了更好的函數(shù),可以替代 crypto_rand_secure 使用,就是 random_bytes 和 random_int。使用內(nèi)置函數(shù),我們將 getToken 函數(shù)改造如下:
當(dāng)然少不了的測(cè)試結(jié)果,我們批量生成一些 32 位長度的字符串。
寫在最后
本文深入探討了生成隨機(jī)數(shù)字,進(jìn)而生成指定長度的字符串,實(shí)現(xiàn)函數(shù)并進(jìn)行了測(cè)試。大家可以在機(jī)器環(huán)境進(jìn)行測(cè)試。
Happy coding :_)
我是 @程序員小助手 ,持續(xù)分享編程知識(shí),歡迎關(guān)注。 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的加密生成指定长度_3分钟短文 | PHP伪随机Token生成器,实地测试,效果感人!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风变的python课程怎么样_风的解释|
- 下一篇: php设置用户头像,PHP针对多用户实现