PHP substr计数错误

时间:2013-05-18 21:35:15

标签: php

我想要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个字符 - 为什么会这样?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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个随机字节并对其进行编码。

答案 2 :(得分:1)

错误

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

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

解决方案

您可以使用

解决它
openssl_random_pseudo_bytes(110).

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

答案 3 :(得分:0)

我正在

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

伯爵是128.

答案 4 :(得分:-2)

您可以使用此功能

function getRandomString($length) {
    $res = '';
    do {
        $res .= md5(uniqid(mt_rand()));
    } while (strlen($res) < $length);
    return substr($res, 0, $length);
}