2

Symfony 2 在这里真的很新。我正在尝试实现 secureRandom 类和 nextType(int) 来生成一个 32 字符的随机字符串。但是,该方法似乎返回非标准字符 (UTF8)。

代码:

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

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

...

结果:

#ïŽ+cÐÁ-ˆ5FZ{CD:­ïN2¨x…3ß,î2

有没有办法指定我只想要标准英文字符?先感谢您!

4

1 回答 1

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 个字节的数据转换为十六进制值。

于 2013-10-15T22:05:14.067 回答