PHP7中的随机字符串

PHP7中的随机字符串,php,random,Php,Random,我试图使用PHP7的全新random_bytes()函数创建一个8和12的随机字符串 在中,只有一个示例,说明如何使用bin2hex()创建十六进制字符串。为了获得更大的随机性,我想生成一个字母数字[a-zA-Z0-9]字符串,但找不到实现这一点的方法 提前感谢您的帮助 ninsky使用随机字节的ASCII码作为字符数组(或字符串)的索引。大概是这样的: // The characters we want in the output $chars = '0123456789ABCDEFGHIJK

我试图使用PHP7的全新random_bytes()函数创建一个8和12的随机字符串

在中,只有一个示例,说明如何使用bin2hex()创建十六进制字符串。为了获得更大的随机性,我想生成一个字母数字[a-zA-Z0-9]字符串,但找不到实现这一点的方法

提前感谢您的帮助

ninsky使用随机字节的ASCII码作为字符数组(或字符串)的索引。大概是这样的:

// The characters we want in the output
$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$count = strlen($chars);

// Generate 12 random bytes
$bytes = random_bytes(12);

// Construct the output string
$result = '';
// Split the string of random bytes into individual characters
foreach (str_split($bytes) as $byte) {
    // ord($byte) converts the character into an integer between 0 and 255
    // ord($byte) % $count wrap it around $chars
    $result .= $chars[ord($byte) % $count];
}

// That's all, folks!
echo($result."\n");

您可以使用另外两种方法。根据[a-zA-Z0-9]制作阵列,然后是1。从数组2中随机抽取6或8个元素。洗牌此阵列,从起始位置或阵列的任何部分获取6或8个元素

<?php

$small_letters = range('a', 'z');
$big_letters = range('A', 'Z');
$digits = range (0, 9);

$res = array_merge($small_letters, $big_letters, $digits);
$c = count($res);
// first variant

$random_string_lenght = 8;
$random_string = '';
for ($i = 0; $i < $random_string_lenght; $i++)
{
    $random_string .= $res[random_int(0, $c - 1)];
}

echo 'first variant result ', $random_string, "\n";

// second variand
shuffle($res);
$random_string = implode(array_slice($res, 0, $random_string_lenght));
echo 'second variant result ', $random_string, "\n";

您是否意识到
random_bytes()
的设计目的不是将其字节范围限制为ASCII字符集的子集?这并不是你想要的帽子的合适功能。通过将自己限制在[a-zA-Z0-9]范围内,你可以获得更少的随机性,而不是期望的“更大的随机性”
random_bytes()
设计为加密安全。基本上和标准硬件一样好。看起来你做得更好了,但实际上你只是击中了自己的脚。这里似乎有一个误解,导致了前面的两条评论,因为你的用例是完全有效的。你的动机也是正确的:用8个字符,你的字符串中的“随机性”大约是用十六进制编码的50000倍,而用12个字符,它已经是这个数字的1100万倍了。似乎是你想要的。