php7随机数,random_int()

random_int()

(PHP 7)

Generates cryptographically secure pseudo-random integers

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

Generates cryptographic random integers that are suitable for use where unbiased results are critical, such as when shuffling a deck of cards for a poker game.

The sources of randomness used for this function are as follows:On Windows,»CryptGenRandom()will always be used. As of PHP 7.2.0,the» CNG-APIwill always be used instead.

On Linux,the» getrandom(2)syscall will be used if available.

On other platforms,/dev/urandomwill be used.

If none of the aforementioned sources are available, then anExceptionwill be thrown.Note:Although this function was added to PHP in PHP 7.0,a» userland implementationis available for PHP 5.2 to 5.6, inclusive.

参数$minThe lowest value to be returned, which must bePHP_INT_MINor higher.$maxThe highest value to be returned, which must be less than or equal toPHP_INT_MAX.

返回值

Returns a cryptographically secure random integer in the range$minto$max, inclusive.

错误/异常If an appropriate source of randomness cannot be found,anExceptionwill be thrown.

If invalid parameters are given,aTypeErrorwill be thrown.

If$maxis less than$min,anErrorwill be thrown.

范例

Example #1random_int()example<?php

var_dump(random_int(100, 999));

var_dump(random_int(-1000, 0));

?>

以上例程的输出类似于:int(248)

int(-898)

参见Here is a simple backporting function, it works for PHP >= 5.1

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

$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);

?><?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());

?>This function is based on Andrew Moore's UUID generation function on the uniqid function; it has been updated to use random_int() on PHP 7.0 or later yet continue to function with earlier versions using mt_rand().

function generateUUIDv4()

{

if(version_compare(PHP_VERSION,'7.0.0', '

{

return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

// 32 bits for "time_low"

mt_rand(0, 0xffff), mt_rand(0, 0xffff),

// 16 bits for "time_mid"

mt_rand(0, 0xffff),

// 16 bits for "time_hi_and_version",

// four most significant bits holds version number 4

mt_rand(0, 0x0fff) | 0x4000,

// 16 bits, 8 bits for "clk_seq_hi_res",

// 8 bits for "clk_seq_low",

// two most significant bits holds zero and one for variant DCE1.1

mt_rand(0, 0x3fff) | 0x8000,

// 48 bits for "node"

mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)

);

}

else

{

return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

// 32 bits for "time_low"

random_int(0, 0xffff), random_int(0, 0xffff),

// 16 bits for "time_mid"

random_int(0, 0xffff),

// 16 bits for "time_hi_and_version",

// four most significant bits holds version number 4

random_int(0, 0x0fff) | 0x4000,

// 16 bits, 8 bits for "clk_seq_hi_res",

// 8 bits for "clk_seq_low",

// two most significant bits holds zero and one for variant DCE1.1

random_int(0, 0x3fff) | 0x8000,

// 48 bits for "node"

random_int(0, 0xffff), random_int(0, 0xffff), random_int(0, 0xffff)

);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值