当前位置:首页 > 教程/笔记 > 正文内容

php生成随机字符的方法及性能对比

当需要生成随机字符时,php可以通过几种不同的方法来完成。本文通过使用五种不同方法生成随机字符的示例,并对比它们的性能进行比较,看看你最常用的随机字符生成方式是否是最高效的。

未标题-1.png

一、rand() 函数生成随机字符

function generateRandomString1($length) {
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $random = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

二、使用 mt_rand()函数生成随机字符

function generateRandomString2($length) {
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[mt_rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

三、使用 random_bytes() 函数生成随机字符

function generateRandomString3($length) {
    $bytes = random_bytes($length);
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[ord($bytes[$i]) % $charactersLength];
    }
    return $randomString;
}

四、使用 openssl_random_pseudo_bytes() 函数生成随机字符

function generateRandomString4($length) {
    $bytes = openssl_random_pseudo_bytes($length);
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[ord($bytes[$i]) % $charactersLength];
    }
    return $randomString;
}

五、使用random_int() 函数生成随机字符

function generateRandomString5($length) {
    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[random_int(0, $charactersLength - 1)];
    }
    return $randomString;
}

六、php生成随机字符的性能测试

如果我们想要比较这些方法的性能,我们可以使用 PHP 的 microtime()`函数来测量生成随机字符的时间,并进行性能对比测试:

$length = 10; // 要生成的随机字符长度
$start1 = microtime(true);
$randomString1 = generateRandomString1($length);
$end1 = microtime(true);
$executionTime1 = $end1 - $start1;
$start2 = microtime(true);
$randomString2 = generateRandomString2($length);
$end2 = microtime(true);
$executionTime2 = $end2 - $start2;
$start3 = microtime(true);
$randomString3 = generateRandomString3($length);
$end3 = microtime(true);
$executionTime3 = $end3 - $start3;
$start4 = microtime(true);
$randomString4 = generateRandomString4($length);
$end4 = microtime(true);
$executionTime4 = $end4 - $start4;
$start5 = microtime(true);
$randomString5 = generateRandomString5($length);
$end5 = microtime(true);
$executionTime5 = $end5 - $start5;
echo "Method 1: $randomString1 (Execution time: $executionTime1 seconds)<br>";
echo "Method 2: $randomString2 (Execution time: $executionTime2 seconds)<br>";
echo "Method 3: $randomString3 (Execution time: $executionTime3 seconds)<br>";
echo "Method 4: $randomString4 (Execution time: $executionTime4 seconds)<br>";
echo "Method 5: $randomString5 (Execution time: $executionTime5 seconds)<br>";

上面的代码,我们能够计算出每个方法的执行时间,并在结果中打印出生成的随机字符和执行时间。但是因为单次性测试的性能结果可能因环境和系统状态的不同而有所差异,为了更准确地评估性能,我们应该多次运行后并求平均时间。为了能够更准确的测试他们的性能,我们打算采用每一种方法各生成100次随机字符,然后统计其总时间,然后计算出平均时间,更加平均时间来判断其性能。

下面的代码是按照每种生成随机字符的方法生成一百次随机字符,然后我们统计允许总时间,最后按平均时间大小排列性能优劣:

$length = 10; // 要生成的随机字符长度
$iterations = 100; // 迭代次数
// 方法一:rand() 函数生成随机字符
$totalTime1 = 0;
for ($i = 0; $i < $iterations; $i++) {
    $start1 = microtime(true);
    $randomString1 = generateRandomString1($length);
    $end1 = microtime(true);
    $executionTime1 = $end1 - $start1;
    $totalTime1 += $executionTime1;
}
$averageTime1 = $totalTime1 / $iterations;
// 方法二:mt_rand() 函数生成随机字符
$totalTime2 = 0;
for ($i = 0; $i < $iterations; $i++) {
    $start2 = microtime(true);
    $randomString2 = generateRandomString2($length);
    $end2 = microtime(true);
    $executionTime2 = $end2 - $start2;
    $totalTime2 += $executionTime2;
}
$averageTime2 = $totalTime2 / $iterations;
// 方法三:random_bytes() 函数生成随机字符
$totalTime3 = 0;
for ($i = 0; $i < $iterations; $i++) {
    $start3 = microtime(true);
    $randomString3 = generateRandomString3($length);
    $end3 = microtime(true);
    $executionTime3 = $end3 - $start3;
    $totalTime3 += $executionTime3;
}
$averageTime3 = $totalTime3 / $iterations;
// 方法四:openssl_random_pseudo_bytes() 函数生成随机字符
$totalTime4 = 0;
for ($i = 0; $i < $iterations; $i++) {
    $start4 = microtime(true);
    $randomString4 = generateRandomString4($length);
    $end4 = microtime(true);
    $executionTime4 = $end4 - $start4;
    $totalTime4 += $executionTime4;
}
$averageTime4 = $totalTime4 / $iterations;
// 方法五:random_int() 函数生成随机字符
$totalTime5 = 0;
for ($i = 0; $i < $iterations; $i++) {
    $start5 = microtime(true);
    $randomString5 = generateRandomString5($length);
    $end5 = microtime(true);
    $executionTime5 = $end5 - $start5;
    $totalTime5 += $executionTime5;
}
$averageTime5 = $totalTime5 / $iterations;
// 按平均时间大小排列性能优劣
$methods = [
    'Method 1' => $averageTime1,
    'Method 2' => $averageTime2,
    'Method 3' => $averageTime3,
    'Method 4' => $averageTime4,
    'Method 5' => $averageTime5
];
$str='生成长度为'.$length.'次数为'.$iterations.'需要的时间';
arsort($methods);
// 打印结果
foreach ($methods as $method => $averageTime) {
    echo "$method : $str $averageTime 秒<br>";
}

运行结果:

image.png

image.png

image.png

image.png

结论:通过多次运行比较,方法1、2、3、4性能明显优于方法5。方法1、2、3生成相同长度的随机字符和次数的处理时间每次都相差不大。

本次使用的方法是通过迭代一百次每种方法生成随机字符并统计总时间,之后计算平均时间,最后按照平均时间大小对性能进行排列。输出结果会按照性能优劣排序,从最快到最慢打印每种方法的平均执行时间。