2013-10-15 130 views
2

這裏真的是新的Symfony 2。我試圖實現secureRandom類和nextType(int)來生成一個32字符的隨機字符串。但是,該方法似乎返回非標準字符(UTF8)。Symfony 2.3 nextBytes()不返回預期結果

代碼:

use Symfony\Component\Security\Core\Util\SecureRandom; 

$generator = new SecureRandom(); 
$random = $generator->nextBytes(32); 

... 

結果:

有沒有指定我只想標準的英文字符的方法嗎? 提前謝謝!

回答

17

翻閱源代碼https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Core/Util/SecureRandom.php看起來,默認情況下該函數嘗試使用openssl函數openssl_random_pseudo_bytes來生成字節。所以要得到這個十六進制版本,你可以調用bin2hex。

use Symfony\Component\Security\Core\Util\SecureRandom; 

$generator = new SecureRandom(); 
$random = $generator->nextBytes(32); 
$humanReadableString = bin2hex($random); 

或保存的變量賦值,並在步驟1翻譯:

$random = bin2hex($generator->nextBytes(32)); 

每個字節由8位組成。 AKA 0或1(二進制,基數2)。

每4位可以用1個十六進制值(基數16)表示。

所以,如果你要求1字節(8個字符)說「11101001」,那麼將其轉換爲十六進制會給你「E9」(2個字符)。

爲了使用nextBytes獲得一個隨機的32個字符串,你將需要16個字節的數據轉換爲十六進制值。

+0

謝謝你的回答。這將nextBytes(32)的結果轉換爲常規文本,但字符串的長度遠遠長於32.我必須使用substr()來縮短它。是否有更好的解決方案來生成一個隨機的32個字符串? substr(bin2hex($ generator-> nextBytes(32)),0,32); – Pathsofdesign

+1

那是因爲bin2hex是字節的十六進制表示。如果你想要一個32個字符的字符串,你可以使用nextBytes(16);顯示爲字符串的32個字節實際上是128個字符。以十六進制顯示的地方是64。 – Chausser