-1

我想要一个 130 个字符的随机字符串

$param['sec1'] = base64_encode(openssl_random_pseudo_bytes(95));
$param['sec1'] = substr($param['sec1'], 0, 130);
var_dump($param['sec1']);

我得到以下结果:

    string(128) "zrAND6xJVREfTA6SMfp1k9C+UDzabPMse6Awd/1Vul+2AgHLBzoOc0T/VlbQSV6dVjy38
d/3dkRDaNnG9tJjCvy3Bm/OccPKo2amJkEANTAWTvt+cPtgIZW42FWdntE=" ["zrAND6xJVREfTA6SMfp1k9C+UDzabPMse6Awd\/1Vul+2AgHLBzoOc0T\/VlbQSV6dVjy38d\/
3dkRDaNnG9tJjCvy3Bm\/OccPKo2amJkEANTAWTvt+cPtgIZW42FWdntE=","dT+w00J2fQPwst2
VKKG55cck6THLW7PIkKQReYlw4U3Q4fWJqagsxfRzrGl0fsHbjWWw9diYkqDbagJLwm0KCUVjHTC
9Rs62Tv1tdyIXNkJtc7Ba4mRbbTOZpHpeHFw=","SAbUFosDFS1KKHXAXGGtfxO09WxeqK\/rO10
9cKKtUPUA7dgn\/jC\/snRZt4Z\/OAlMdL4FU9nq0HxcvXAafKPDV3akLcQReJAvybkjIPTUTPcu
5jo6N1kxFt3tX5GGWp0="]

var_dump 说 128 个字符,但显然超过 128 个 - 为什么会这样?

4

5 回答 5

3

以开头的部分["zrAND不是由您给出的代码生成的,而是由一些已执行但未在您的问题中显示的代码生成的。

var_dump($param['sec1']);只打印出来string(128) "zrAND6xJVREfTA6SMfp1k9C+UDzabPMse6Awd/1Vul+2AgHLBzoOc0T/VlbQSV6dVjy38d/3dkRDaNnG9tJjCvy3Bm/OccPKo2amJkEANTAWTvt+cPtgIZW42FWdntE="

于 2013-05-18T21:41:50.397 回答
2

因为Base64编码将编码信息的长度增加了大约 33%——准确地说,编码长度为ceil(encoded_bytes / 3) * 4.

当编码 95 个字节时,你最终得到 128,因为 95 / 3 = 31.667 并且四舍五入我们有 32 * 4 = 128。断言超过 128 是错误的。

重要的是要了解这 128 个字符并不比您开始生成的 95 个字节“更随机”;它们只是表示相同信息的不同方式

如果你想要 130 个随机字节,那么你应该简单地用openssl_random_pseudo_bytes. 使用 Base64 将这些字节编码为可打印形式将占用 176 个字符。

如果您想要 130 个随机可打印字符(坦率地说这听起来很可疑),那么生成 98 个随机字节并对其进行编码。

于 2013-05-18T21:39:36.263 回答
1

错误

您误读了输出:您发布的输出是两次长度为 128 的字符串和一些其他字符串,每个字符串都用引号括起来并用逗号分隔。

你只得到一个 128 字符串的原因是从 openssl_random_pseudo_bytes(95) 给出的 95 个字节的 base64 编码占用了 128 个字符,因此子字符串不能提供更多并且没有效果。

解决方案

你通过使用解决它

openssl_random_pseudo_bytes(110).

110 个字符的 base-64 编码结果为 128 个字符,因此您可以获得所需的字符串长度。

于 2013-05-18T21:52:48.797 回答
0

我越来越

string(128) "mCtlWoWT6Dsy3QQyeH09Nm0oipxtnsG1zBDnCfNerCTyu6qfPtLxikPIff2vVbOMDhgt/QhclOAh5XR/L7rD0VOkRUYd3o3GtjJotO40RYvLZHrvO96XBdgAUvI8Mxc="

计数为 128。

于 2013-05-18T21:41:02.393 回答
-2

你可以使用这个功能

function getRandomString($length) {
    $res = '';
    do {
        $res .= md5(uniqid(mt_rand()));
    } while (strlen($res) < $length);
    return substr($res, 0, $length);
}
于 2013-05-18T21:48:08.830 回答