На других языках я бы сгенерировал их по частям и сохранил в строках, но с 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)));
Это работает для меня!
Взгляните на это сообщение в блоге, это, похоже, подводит итог проблеме довольно хорошо:
$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 );