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