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注释实例技巧
Oct 03 PHP
PHP 彩色文字实现代码
Jun 29 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
php精确的统计在线人数的方法
Oct 21 PHP
PHP和C#可共用的可逆加密算法详解
Oct 26 PHP
PHP常见数组函数用法小结
Mar 21 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 PHP
php mysql 封装类实例代码
Sep 18 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
python实现按行分割文件
2019/07/22 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
详解Django admin高级用法
2019/11/06 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
计算机专业推荐信范文
2013/11/20 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
python 爬取天气网卫星图片
2021/06/07 Python