Как вы генерируете случайное число по 32-битовому пределу в PHP?

На других языках я бы сгенерировал их по частям и сохранил в строках, но с PHP вы не можете выбрать тип данных, чтобы он не работал, его автоматически устанавливали как целое число, а затем сохраняли только максимальный целочисленный размер.

Есть ли какие-либо решения?

Да, вы можете получить некоторые случайные данные (например, из /dev/urandom или openssl_random_pseudo_bytes ).

Затем преобразуйте данные в десятичное представление, используя, например, bcmath или gmp. См. Этот ответ о том, как это сделать.

mt_rand(0, 10000) будет генерировать четыре цифры вашего случайного числа. Вызовите его несколько раз, соедините результаты:

mt_rand(0, 10000) . mt_rand(0, 10000) . mt_rand(0, 100) mt_rand(0, 10000) . mt_rand(0, 10000) . mt_rand(0, 100) – для десятизначного числа.

У этого есть многочисленные проблемы, но это может быть достаточно для вашего конкретного случая использования.

У меня такая же проблема. У меня была функция, которая должна генерировать случайное число от 0 до 2 ^ 32-1 (представляя его как 8-значную шестнадцатеричную строку). mt_rand () генерирует только числа от 0 до 2 ^ 31-1.

Это не удается:

 return hexdec(mt_rand(0,4294967295)); 

Я решил это с помощью одной строки кода:

 return sprintf("%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535))); 

Это именно то, что вы предложили, разбивая рандомизацию на части. Он генерирует два случайных числа, каждое от 0 до 2 ^ 16-1 (65,535) (от шестнадцатеричного от 0000 до FFFF), а затем объединяет их вместе, используя sprintf для нулевого ввода результатов в виде шестнадцатеричных строк.

Возможны каждое единственное число от 0 до 2 ^ 32-1 (hex 00000000 до FFFFFFFF). Если вам понадобилось 48-битное случайное шестнадцатеричное число (hex 000000000000 – FFFFFFFFFFFF), вы можете расширить его так:

 return sprintf("%04X%04X%04X", (mt_rand(0,65535)), (mt_rand(0,65535)), (mt_rand(0,65535))); 

Это работает для меня!

Взгляните на это сообщение в блоге, это, похоже, подводит итог проблеме довольно хорошо:

http://blog.phphorizons.com/?p=10

 $i = (int) $i; 

Вы можете объявить тип.

Я бы сделал что-то вроде этого:

 function getBigRandom($length, $space = '0123456789', $trim = true) { $str = ''; $spaceLen = strlen($space); for ($i = 0; $i < $length; $i++) { $str .= $space[mt_rand(0, $spaceLen - 1)]; } if ($trim) { $str = ltrim($str, '0'); } return $str; } 

Применение:

 $random = getBigRandom(15); // Generate up to a 15 digit random number 

Случайное распределение должно быть довольно четным, так как каждое десятичное место имеет равную вероятность быть каждым типом значения … При вызове его с параметрами по умолчанию будет генерироваться число. Если вы хотите сгенерировать строку (соль и т. Д.), Вы можете сделать:

 $random = getBigRandom( 128, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', false );