为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PHP 随机变量长度 bigint(8) 数字?

使用 PHP 随机变量长度 bigint(8) 数字?

PHP
开满天机 2023-10-21 16:01:02
使用 php7,我想生成一个随机变量长度无符号 bigint(8) 数字 - 介于 1 和 18446744073709551615 之间
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

简短的回答,gmp_random_range():

$from = 0;

$to = '18446744073709551615';

$random = gmp_random_range($from, $to);

var_dump($random, (string)$random);

例如:


object(GMP)#1 (1) {

  ["num"]=>

  string(20) "10366718409313808674"

}

string(20) "10366718409313808674"

补充题外话:

  • MySQL 的BIGINT是一个 8 字节整数,如果有符号则表示-2 63到 2 63 -1 ,如果无符号则表示 0 到 2 64 -1

  • PHP_INT_MAX在 32 位版本中是 4 字节值,但在 64 位版本中是 8 字节值。无论哪种情况,都会签署。

因此,如果您可以安全地假设 64 位 PHP 并且您想要有符号的数字,那么您基本上就可以完成任何随机生成函数。如果您需要加密安全数字,则可以使用random_int() ,否则可以使用mt_rand():

var_dump(random_int(0, PHP_INT_MAX));var_dump(mt_rand(0, PHP_INT_MAX));

但你想要无符号值,因此你必须切换到字符串。一旦到达那里,一个明显的方法是生成两个整数并将它们连接为字符串 - 棘手的部分是确保不会溢出范围。作为替代方案,您可以使用 GMP 任意精度扩展,它有一个专用功能。

PS你实际上提到了BIGINT(8)。8 只是从兼容客户端打印时的显示尺寸,它不代表存储范围,也不会以任何方式强制执行。由于您明确表示期望最多 20 位数字,因此它只是一种误导。


查看完整回答
反对 回复 2023-10-21
?
慕容708150

TA贡献1831条经验 获得超4个赞

您可以使用此函数生成超过1任何最大值的数字字符串PHP_INT_MAX(最大值和结果都必须是字符串)

重要提示:不要将其用于加密,因为并非所有数字都有相同的被选择机会:

  • 由于我们默认为零到“1”,结果“1”的机会加倍

  • 我们随机选择每个字符,因此根据选择的最大值,并非所有数字都有相同的机会

<?php

function notCryptoRandomDecimalString($maxStrValue){

    $result = '';

    $maxBegin = '';

    

    for($i = 0; $i < strlen($maxStrValue); $i++){

        $maxDigit = $maxStrValue[$i];

        //if beginning of the result is same than beginning of the max,

        //we limit random to current char from maximum, or else it can be from 0 to 9

        if($result === $maxBegin){

            $result .= random_int(0, $maxDigit);

        }else{

            $result .= random_int(0, 9);

        }

        $maxBegin .= $maxDigit;

    }

    

    //remove leading zeroes

    $result = ltrim($result, '0');

    

    //if zero was picked, default to 1

    if($result === ''){

        $result = '1';

    }

    

    return $result;

}


echo(notCryptoRandomDecimalString('18446744073709551615'));


查看完整回答
反对 回复 2023-10-21
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信