PHPCon Poland 2024

random_int

(PHP 7, PHP 8)

random_intObtém um número inteiro selecionado uniformemente e criptograficamente seguro

Descrição

random_int(int $min, int $max): int

Gera um número inteiro selecionado uniformemente entre o mínimo e o máximo fornecidos.

A aleatoriedade gerada por esta função é adequada para todas as aplicações, incluindo a geração de segredos de longo prazo, como chaves de criptografia.

As fontes de aleatoriedade usadas para esta função são as seguintes:

  • Linux: » getrandom(), /dev/urandom

  • FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom

  • Windows (PHP >= 7.2): » CNG-API

    Windows: » CryptGenRandom

  • macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22 se CCRandomGenerateBytes estiver disponível em tempo de compilação): CCRandomGenerateBytes()

    macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom

  • NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom

  • DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom

  • Solaris (PHP >= 8.1): » getrandom(), /dev/urandom

  • Qualquer combinação de sistema operacional e versão do PHP não mencionada anteriormente: /dev/urandom
  • Se nenhuma das fontes estiver disponível ou todas falharem em gerar aleatoriedade, então uma exceção Random\RandomException será lançada.

Nota: Embora esta função tenha sido adicionada ao PHP no PHP 7.0, uma » implementação no espaço do usuário está disponível para o PHP 5.2 ao 5.6, inclusive.

Parâmetros

min

O menor valor a ser retornado.

max

O maior valor a ser retornado.

Valor Retornado

Um número inteiro criptograficamente seguro e selecionado uniformemente do intervalo fechado [min, max]. Ambos min e max são valores de retorno possíveis.

Erros/Exceções

  • Se uma fonte apropriada de aleatoriedade não puder ser encontrada, uma exceção Random\RandomException será lançada.
  • Se max é menor que min, um ValueError será lançado.

Registro de Alterações

Versão Descrição
8.2.0 No caso de uma falha de CSPRNG, esta função agora lançará um Random\RandomException. Anteriormente um raso Exception era lançado.

Exemplos

Exemplo #1 Exemplo de random_int()

<?php
var_dump
(random_int(100, 999));
var_dump(random_int(-1000, 0));
?>

O exemplo acima produzirá algo semelhante a:

int(248)
int(-898)

Veja Também

add a note

User Contributed Notes 4 notes

up
13
s rotondo90 at gmail com
7 years ago
Here is a simple backporting function, it works for PHP >= 5.1

<?php
if (!function_exists('random_int')) {
function
random_int($min, $max) {
if (!
function_exists('mcrypt_create_iv')) {
trigger_error(
'mcrypt must be loaded for random_int to work',
E_USER_WARNING
);
return
null;
}

if (!
is_int($min) || !is_int($max)) {
trigger_error('$min and $max must be integer values', E_USER_NOTICE);
$min = (int)$min;
$max = (int)$max;
}

if (
$min > $max) {
trigger_error('$max can\'t be lesser than $min', E_USER_WARNING);
return
null;
}

$range = $counter = $max - $min;
$bits = 1;

while (
$counter >>= 1) {
++
$bits;
}

$bytes = (int)max(ceil($bits/8), 1);
$bitmask = pow(2, $bits) - 1;

if (
$bitmask >= PHP_INT_MAX) {
$bitmask = PHP_INT_MAX;
}

do {
$result = hexdec(
bin2hex(
mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM)
)
) &
$bitmask;
} while (
$result > $range);

return
$result + $min;
}
}
?>

Randomness test

<?php
$max
= 100; // number of random values
$test = 1000000;

$array = array_fill(0, $max, 0);

for (
$i = 0; $i < $test; ++$i) {
++
$array[random_int(0, $max-1)];
}

function
arrayFormatResult(&$item) {
global
$test, $max; // try to avoid this nowdays ;)

$perc = ($item/($test/$max))-1;
$item .= ' '. number_format($perc, 4, '.', '') .'%';
}

array_walk($array, 'arrayFormatResult');

print_r($array);
?>
up
3
bens at effortlessis dot com
3 years ago
On my system (5th gen i7) random_int() takes about 14x longer to do the same number of calculations than rand().

for ($i=0; $i<10000000; $i++)
$x = rand(1, PHP_INT_MAX);

Takes 0.86 seconds for rand(), 12.29 seconds for random_int(). So use random_int() somewhat sparingly.

If it's not really important to be truly random, use rand() instead, especially in a tight loop.
up
0
ccb_bc at hotmail dot com
4 years ago
<?php
// PHP >= 7
function str_rand(int $length = 16){
$x = '';
for(
$i = 1; $i <= $length; $i++){
$x .= dechex(random_int(0,255));
}
return
substr($x, 0, $length);
}
var_dump(str_rand());
?>
up
-1
Hayley Watson
9 months ago
A small function for generating version 4 GUIDs.

<?php
function v4uuid()
{
$a = str_pad(dechex(random_int(0x0000_0000, 0xffff_ffff)), '0', STR_PAD_LEFT);
$b = str_pad(dechex(random_int(0x0000, 0xffff)), '0', STR_PAD_LEFT);
$c = dechex(random_int(0x4000, 0x4fff));
$d = dechex(random_int(0x8000, 0xbfff));
$e = str_pad(dechex(random_int(0x0000_0000_0000, 0xffff_ffff_ffff)), '0', STR_PAD_LEFT);
return
"$a-$b-$c-$d-$e";
}
?>
To Top