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

时间:2010-11-08 01:30:39

标签: php random

基本上,我正在寻找执行以下功能的功能

generateToken(128)

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

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

3 个答案:

答案 0 :(得分:3)

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

更容易允许十六进制编码(每个字符4位)。然后,您可以生成128个真正的随机位,然后以十六进制编码,以便在您的应用程序中使用。 Base64编码(每个字符6位)对这类事情也很有用。

openssl_random_pseudo_bytes将为您提供一串随机字节,您可以使用bin2hex进行编码,否则您可以在自己的令牌生成例程中使用mt_rand

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

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

请注意不要将编码的字符串长度与原始数据长度混淆。如果您选择使用字母数字字符(az,AZ,0-9)的16个字符的字符串,那么每个字符只能获得6位信息(62的日志基数2接近6),因此您的16个字符的字符串将只编码96位信息。您应该将您的令牌视为一个不透明的字节数组,并且只关心当您实际尝试通过网络发送它或将其放入cookie或其他任何内容时将其转入/转出字符串。

答案 1 :(得分:1)

从PHP 5.3开始:

$rand128 = bin2hex(openssl_random_pseudo_bytes(16));

答案 2 :(得分:0)

你的目的是什么?

如果您只想要一个唯一的ID,请使用uniqid:

http://www.php.net/manual/en/function.uniqid.php

它不是随机的,它本质上是一个基于microtime的十六进制字符串。如果你执行uniqid('',true),那么它将返回一个基于microtime的十六进制字符串,并在id的末尾添加一堆随机数(所以即使两个调用进入相同的微秒,他们不太可能分享一个独特的身份证明。

如果你需要一个16个字符的字符串,那么目的是什么?你在密码吗?字符串应该是多么随机?总而言之,你总能做到:

$toShow = array();
for($i = 0; $i<16; $i++){
    $toShow[] = chr(mt_rand(ord('a'), ord('z')));
}
return $toShow

现在,这会创建一个介于'a'和'z'之间的字符串。您可以将“ord('a')”更改为0,将“ord('z')”更改为255以获得完全随机的二进制字符串...或您需要的任何其他范围。