Я хочу создать случайную строку и проводил некоторые исследования и нашел следующую ссылку:
http://golearnphp.com/php-rand-vs-mt_rand-and-openssl_random_pseudo_bytes/
function generateRandom($length) { $validCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789'; $myKeeper = ''; for ($n = 1; $n < $length; $n++) { $whichCharacter = rand(0, strlen($validCharacters) - 1); $myKeeper .= $validCharacters{$whichCharacter}; } return $myKeeper; } function generateRandomdMT($length) { $validCharacters = 'abcdefghijklmnopqrstuvwxyz0123456789'; $myKeeper = ''; for ($n = 1; $n < $length; $n++) { $whichCharacter = mt_rand(0, strlen($validCharacters) - 1); $myKeeper .= $validCharacters{$whichCharacter}; } return $myKeeper; } $start = microtime(true); echo htmlentities(generateRandom(100000)); var_dump(microtime(true) - $start); $start = microtime(true); echo htmlentities(generateRandomdMT(100000)); var_dump(microtime(true) - $start); $start = microtime(true); echo htmlentities(substr(base64_encode(openssl_random_pseudo_bytes(100000)), 0, 100000)); var_dump(microtime(true) - $start);
В сообщении автор говорит, что openssl_random_pseudo_bytes значительно быстрее, чем два других. Это правда? Действительно ли openssl_random_pseudo_bytes намного быстрее? Это правильный способ проверить «устойчивость» функций?
openssl_random_pseudo_bytes, созданный для криптоватости (проверьте второй параметр). Ранд – старая функция ранда с небольшим периодом повторения. MT_Rand лучше, чем rand, но не должен использоваться криптосистемами.
Готов поспорить, что разница между временем выполнения не влияет на ваше приложение.
Также. Эти функции возвращают разные результаты. Первые две строки возврата с 36 возможными буквами. И третий возвращает строку с 64 возможными символами. Результат двух первых функций короче третьего.
Если вы делаете оптимизацию для ускорения вашего приложения, первое, что вам нужно знать: как профилировать свой код.
В сообщении автор говорит, что openssl_random_pseudo_bytes значительно быстрее, чем два других. Это правда?
В нормальных ситуациях mt_rand()
значительно быстрее, чем openssl_random_pseudo_bytes()
.
Это только медленнее в тестовом коде, который вы опубликовали, потому что вы сравниваете яблоки и апельсины. Для rand()
и mt_rand()
вы используете сложные функции, которые строят строку по одному байту за раз, тогда как для openssl_random_pseudo_bytes()
вы используете необработанный двоичный поток, который он создает с base64_encode()
который будет намного быстрее ,
Если вы можете получить необработанный двоичный поток из mt_rand () или rand () или последовательность чисел от 0 до 63 из openssl_random_pseudo_bytes()
, вы можете сравнить яблоки с яблок.
В моем тестировании я обнаружил mt_rand()
примерно в 4 раза быстрее, чем openssl_random_pseudo_bytes(4)
когда я использовал unpack('V', openssl_random_pseudo_bytes(4) & "\xff\xff\xff\x7f")
, чтобы получить эквивалент вывод в mt_rand()
. Однако это по-прежнему технически яблоки для апельсинов, потому что я делаю дополнительную обработку на одном, чтобы соответствовать этому другому, прямо в противоположном направлении к вам.