Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何生成128位长的字符串?_Php_Random - Fatal编程技术网

Php 如何生成128位长的字符串?

Php 如何生成128位长的字符串?,php,random,Php,Random,基本上,我正在寻找一个函数来执行以下操作 generateToken(128) 它将返回由整数或字母组成的128位字符串 澄清:根据评论,我不得不改变问题。显然,我正在寻找一个长度为16个字符的字符串,如果它需要128位。有什么原因必须将字符串限制为整数吗?这实际上使问题变得更加困难,因为每个数字给你3.3位(因为2^3.3~=10)。以这种方式精确生成128位的令牌是很棘手的 更容易的是允许十六进制编码(每个字符4位)。然后,您可以生成128个真正的随机位,然后将它们编码为十六进制,以便在应

基本上,我正在寻找一个函数来执行以下操作

generateToken(128)
它将返回由整数或字母组成的128位字符串


澄清:根据评论,我不得不改变问题。显然,我正在寻找一个长度为16个字符的字符串,如果它需要128位。

有什么原因必须将字符串限制为整数吗?这实际上使问题变得更加困难,因为每个数字给你3.3位(因为2^3.3~=10)。以这种方式精确生成128位的令牌是很棘手的

更容易的是允许十六进制编码(每个字符4位)。然后,您可以生成128个真正的随机位,然后将它们编码为十六进制,以便在应用程序中使用。Base64编码(每个字符6位)也适用于这种情况


openssl\u random\u pseudo\u bytes
将为您提供一个可以使用
bin2hex
编码的随机字节字符串,否则您可以在自己的令牌生成例程中使用
mt\u rand


编辑:在阅读了问题的更新之后,您似乎想要生成一个表示128位数据的令牌,而实际字符串长度(以字符为单位)并不那么重要。如果我猜对了您的意图(这是一个唯一的ID,可能用于识别/身份验证),那么我建议您使用
openssl\u random\u pseudo\u bytes
为您的问题生成正确的位数,在本例中为128(16字节)。然后,您可以按照您认为合适的任何方式对这些位进行编码:十六进制和base64是两种可能

请注意,十六进制编码将使用32个字符来编码128位的数据,因为每个字符只编码4位(128/4=32)。Base64将使用22个字符(128/6=21.3)。每个字符占用8位存储空间,但只编码4或6位信息

请非常小心,不要将编码字符串长度与原始数据长度混淆。如果使用字母数字字符(a-z、a-z、0-9)选择16个字符的字符串,则每个字符只能获得6位信息(62的对数基数2接近6),因此16个字符的字符串只能编码96位信息。你应该把你的令牌看作是一个不透明的字节数组,当你真的试图通过网络发送它或者把它放进cookie或者其他什么东西的时候,你只需要担心把它转换成字符串或者从字符串中转换出来。

你的目的是什么

如果您只需要一个唯一的id,请使用uniqid:

它不是随机的,本质上是一个基于微时间的十六进制字符串。如果您使用uniqid(“”,true),那么它将返回一个基于微时间的十六进制字符串,并在id的末尾附加一组随机数(因此,即使两个调用在同一微秒内传入,它们也不可能共享唯一的id)

如果您需要一个16个字符的字符串,那么它的用途是什么?你是在给密码加盐吗?字符串应该有多随机?总而言之,您可以随时执行以下操作:

$toShow = array();
for($i = 0; $i<16; $i++){
    $toShow[] = chr(mt_rand(ord('a'), ord('z')));
}
return $toShow
$toShow=array();
对于从PHP 5.3开始的($i=0;$i):

$rand128 = bin2hex(openssl_random_pseudo_bytes(16));

什么是128位?字符串表示的数字?Axsuul,你的回答没有任何意义。你的意思是你想要一个128位的数字编码为字符串,还是想要一个128位的数字?我假设你在我的答案中想要一个128位的数字。@Cameron一个128位的数字与一个128位的数字不同。一个数字with 128位是介于0和2^128-1之间的数字。我问他是想要一个介于0和2^128-1之间的随机数还是一个128/8=16个字符的字符串。@Artefactor:是的,我知道。这就是为什么我要求澄清:OP想要128位还是128位十进制数字?
openssl\u random\u pseudo\u bytes
没有给出十六进制编码的表示。对吗是的,这是一个很好的解决方案。在那之后,只需使用例如bcmath来构建以10为基数的字符串表示形式的数字。是的,你说得对。我误读了示例,省略了
bin2hex
bit:)相关:请参阅,以了解如何将任意数据转换为以10为基数的数字。使用PHP7.0+,它只是
random\u字节
而不是
openssl\u random\u pseudo\u字节