PHP生成随机密码4种方法及性能对比


Posted in PHP onDecember 11, 2020

方法一:

1、在 33 ? 126 中生成一个随机整数,如 35,

2、将 35 转换成对应的ASCII码字符,如 35 对应 #

3、重复以上 1、2 步骤 n 次,连接成 n 位的密码

该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min ? $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 ? 122 位对应 a ? z 的英文字母,具体可参考 ASCII码表; chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。

function create_password($pw_length = 8)
{
$randpwd = '';
for ($i = 0; $i < $pw_length; $i++)
{
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
} 
// 调用该函数,传递长度参数$pw_length = 6
echo create_password(6);

方法二:

1、预置一个的字符串 $chars ,包括 a ? z,A ? Z,0 ? 9,以及一些特殊字符

2、在 $chars 字符串中随机取一个字符

3、重复第二步 n 次,可得长度为 n 的密码

function generate_password( $length = 8 ) {
// 密码字符集,可任意添加你需要的字符
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|'; 
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
$password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $password;
}

方法三:

1、预置一个的字符数组 $chars ,包括 a ? z,A ? Z,0 ? 9,以及一些特殊字符

2、通过array_rand()从数组 $chars 中随机选出 $length 个元素

3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。

function make_password( $length = 8 )
{
// 密码字符集,可任意添加你需要的字符
$chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
'@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
'[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
'.', ';', ':', '/', '?', '|');
// 在 $chars 中随机取 $length 个数组元素键名
$keys = array_rand($chars, $length); 
$password = '';
for($i = 0; $i < $length; $i++)
{
// 将 $length 个数组元素连接成字符串
$password .= $chars[$keys[$i]];
} 
return $password;
}

方法四:

本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:

1、time() 获取当前的 Unix 时间戳

2、将第一步获取的时间戳进行 md5() 加密

3、将第二步加密的结果,截取 n 位即得想要的密码

function get_password( $length = 8 )
{
$str = substr(md5(time()), 0, 6);
return $str;
}

时间效率对比

我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。

<?php
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
// 记录开始时间
$time_start = getmicrotime(); 
// 这里放要执行的PHP代码,如:
// echo create_password(6); 
// 记录结束时间
$time_end = getmicrotime();
$time = $time_end - $time_start;
// 输出运行总时间
echo "执行时间 $time seconds";
?>

最终得出的结果是:

方法一:9.8943710327148E-5 秒

方法二:9.6797943115234E-5 秒

方法三:0.00017499923706055 秒

方法四:3.4093856811523E-5 秒

可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
PHP中的Session对象如何使用
Sep 25 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
php中array_column函数简单实现方法
Jul 11 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
php排序算法实例分析
Oct 17 PHP
php封装的page分页类完整实例
Oct 18 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
php和vue配合使用技巧和方法
May 09 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
通过代码实例解析PHP session工作原理
Dec 11 #PHP
深入解析PHP底层机制及相关原理
Dec 11 #PHP
基于PHP实现发微博动态代码实例
Dec 11 #PHP
PHP isset empty函数相关面试题及解析
Dec 11 #PHP
PHP数组实际占用内存大小原理解析
Dec 11 #PHP
PHP基于ip2long实现IP转换整形
Dec 11 #PHP
PHP哈希表实现算法原理解析
Dec 11 #PHP
You might like
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
JS控制表格隔行变色
2006/06/26 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
带你了解python装饰器
2017/06/15 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
初中同学聚会邀请函
2014/02/03 职场文书
儿园租房协议书范本
2014/12/02 职场文书
新年祝酒词大全
2015/08/11 职场文书
Python time库的时间时钟处理
2021/05/02 Python
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers