如何在PHP5.5.9中生成159位的安全随机数?

如何在PHP5.5.9中生成159位的安全随机数?,php,random,Php,Random,我需要用PHP做一些大数字的操作。我不得不在和之间做出选择,哪一个似乎是提供这类资料的主要图书馆。我需要逆模方法,该方法在bcmath库中不可用。所以我用的是GMP 现在我需要生成一个介于0和2^159-1之间的随机安全数。但是: gmp\u随机位仅在php>=5.6.3中可用 gmp\u random\u range仅在php>=5.6.3中可用 gmp\u random不允许我精确地指定比特数(以及每只羔羊的比特数是多少以及谁使用这种装置?) 我试图用openssl\u random\u

我需要用PHP做一些大数字的操作。我不得不在和之间做出选择,哪一个似乎是提供这类资料的主要图书馆。我需要逆模方法,该方法在
bcmath
库中不可用。所以我用的是
GMP

现在我需要生成一个介于0和2^159-1之间的随机安全数。但是:

  • gmp\u随机位
    仅在php>=5.6.3中可用
  • gmp\u random\u range
    仅在php>=5.6.3中可用
  • gmp\u random
    不允许我精确地指定比特数(以及每只羔羊的比特数是多少以及谁使用这种装置?)
我试图用
openssl\u random\u pseudo\u字节生成这个数字。我只能使用字节计数,但我尝试了一下。唯一问题:

  • openssl\u random\u pseudo\u bytes(20)
    返回字符串
  • bindec(openssl\u random\u pseudo\u bytes(20))
    返回0
  • hexdec(bin2hex(openssl\u random\u pseudo\u bytes(20))
    返回0
  • gmp\u import
    仅在php>=5.6.1中可用
因此,我放弃了,并尝试将我的php升级到php5.6。基于此,我做到了:

但是如果我运行
phpinfo()
,显示的php版本仍然是5.9.9


请帮帮我!我很绝望。非常感谢!

查看这篇关于随机字符串和整数的文章:

重新启动apache服务以确定您的php版本

请检查您的php版本,5.9不是有效的php版本,可能您有5.5.9,有效版本是:,您可以使用:
sudo php-v

如果您的php版本不是5.6,也不是php7,并且您希望使用5.6,请完全删除php并安装PHP5.6

您可以同时使用php7和5.6并切换:

以下各项应有效(在5.5.9中测试):

这使用了

bindec()
有点混乱,因为它只接受1和0的字符串。但是不需要以
bindec()
开头,因为它将直接接受十六进制参数。
bindec()如果输入超过
PHP_INT_MAX
,则
也将输出一个浮点值,如果输入
gmp_init()
,则会导致不期望的结果。但是,由于表示大量数字是您希望使用gmp的原因,因此从一开始就不可能使用
bindec()

不相关,根据OP的评论:

最后,在一个示例中,您尝试调用
hexdec()
bin2hex()
bindec()
,调用的顺序如下:

hexdec(bin2hex(bindec(openssl_random_pseudo_bytes(20)))
没有意义,因为它试图先将二进制转换为十进制,然后再将二进制转换为十六进制

但是,如我上面的示例所示,仅使用
bin2hex()
,与
bindec()
相反,它接受原始二进制数据,并且没有
PHP_INT_MAX
限制,应该足够了

作为替代方案,您还可以使用:


您是否已将新的php添加到apache配置中?请执行此操作,重新启动apache(或NginX),它应该可以工作。是的。更新php版本后,您还需要重新启动Web服务器。我使用
服务apache2 restart
重新启动了apache,但运气不佳。我应该如何将我的php添加到apache配置中?抱歉
hexdec(bin2hex(bindec
我复制了上一行。我的意思是“
hexdec”(bin2hex(
)。你的建议似乎很有希望。我试试看。谢谢。@Sharcoux啊,我明白了。这更有意义,是的。:)那我就把那句话删掉。你认为我不应该使用
openssl\u random\u pseudo\u bytes
?如果你想生成随机字符串,是的,如果不是,你可以自己生成随机数:
// gmp_init will interpret argument as hexadecimal when first two chars are 0x or 0X
$g = gmp_init( '0x' . bin2hex( openssl_random_pseudo_bytes( 20 ) ) );
echo gmp_strval( $g );
hexdec(bin2hex(bindec(openssl_random_pseudo_bytes(20)))
$g = gmp_init( '0x' . unpack( 'H*', openssl_random_pseudo_bytes( 20 ) )[ 1 ] );
echo gmp_strval( $g );