糯麦 NurMai

400-158-5662

糯麦科技

/

新闻资讯

/

技术讨论

/

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

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

原创 新闻资讯

于 2023-08-23 10:09:24 发布

17066 浏览

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


一、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>";
}


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

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

PHP随机字符串

PHP开发

后端开发

阅读排行

  • 1. 几行代码就能实现Html大转盘抽奖

    大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。

    查看详情
  • 2. 浙江省同区域公司地址变更详细流程

    提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)

    查看详情
  • 3. 微信支付商户申请接入流程

    微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。

    查看详情
  • 4. 阿里云域名ICP网络备案流程

    根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。

    查看详情
  • 5. 微信小程序申请注册流程

    微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。

    查看详情