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

Thats потому, что bin2hex является шестнадцатеричным представлением байтов. Если вам нужна строка с 32 символами, вы можете использовать nextBytes (16); 32 байта, отображаемые в виде строки, на самом деле составляют 128 символов. Где отображается как шестнадцатеричное значение 64. – Chausser