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