2013-10-15 132 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