Как упоминалось в комментариях mt_rand()
он слаб в безопасности, и мы должны использовать / dev / urandom. Моя проблема в том, что из urandom я получаю двоичную строку.
Как преобразовать эту двоичную строку в 0-9a-zA-Z?
Похоже, что base_convert()
здесь не работает.
Только для записи полная функция:
function randomFromDev($len) { $fp = @fopen('/dev/urandom','rb'); $result = ''; if ($fp !== FALSE) { $result .= @fread($fp, $len); @fclose($fp); } else { trigger_error('Can not open /dev/urandom.'); } // convert from binary to string $result = base64_encode($result); // remove none url chars $result = strtr($result, '+/', '-_'); // Remove = from the end $result = str_replace('=', ' ', $result); return $result; }
Вы можете использовать bin2hex для преобразования двоичного кода в строку. И PHP 7 random_bytes добавил поиск urandom.
<?php $bytes = random_bytes(5); $str = bin2hex($bytes); var_dump($str); // string(10) "385e33f741" ?>
просто используйте base64_encode($yourbinaryurandomstring)
с этим результатом вы можете, например, использовать хэш-функцию, такую как sha1()
или md5()
и должны быть точными. Вы даже не делаете никакого преобразования "="
Я не совсем уверен, что хэш-функции могут читать двоичную строку самостоятельно, просто попробуйте.
Одним из способов использования /dev/urandom
является функция uiniqid, которая должна соответствовать вашим потребностям.
Однако, если вам нужны истинные случайные числа, вам лучше использовать /dev/random
как /dev/urandom
все еще является генератором псевдослучайных чисел, которые используют /dev/random
для значений семян.
Доступ к потоку случайных чисел не так уж и трудный.
<?php $r = unpack('v*', fread(fopen('/dev/random', 'r'),16)); $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', $r[1], $r[2], $r[3], $r[4] & 0x0fff | 0x4000, $r[5] & 0x3fff | 0x8000, $r[6], $r[7], $r[8]); ?>
Очевидно, это не производственный код.