php生成随机密码的三种方法小结


Posted in PHP onSeptember 04, 2010

使用PHP开发应用程序,尤其是网站程序,常常需要生成随机密码,如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串,这里我收集整理了几种生成随机字符串的方法,以供大家参考。

方法一

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 = ($chars, $length); 
$password = ''; 
for($i = 0; $i < $length; $i++) 
{ 
// 将 $length 个数组元素连接成字符串 
$password .= $chars[$keys[$i]]; 
} 
return $password; 
}

时间效率对比
我们使用以下PHP代码,计算上面的 3 个随机密码生成函数生成 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 秒
可以看出方法一和方法二的执行时间都差不多,而方法三的运行时间稍微长了点。
原文:http://www.ludou.org/how-to-create-a-password-generator-using-php.html
PHP 相关文章推荐
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
PHP5 面向对象(学习记录)
Dec 02 PHP
php开发环境配置记录
Jan 14 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
十大使用PHP框架的理由
Sep 26 PHP
Yii2中datetime类的使用
Dec 17 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
通过实例解析PHP数据类型转换方法
Jul 11 PHP
PHP安全技术之 实现php基本安全
Sep 04 #PHP
小文件php+SQLite存储方案
Sep 04 #PHP
PHP中文件上传的一个问题
Sep 04 #PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 #PHP
PHP开发需要注意的安全问题
Sep 01 #PHP
php中函数的形参与实参的问题说明
Sep 01 #PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 #PHP
You might like
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
深入理解Python变量与常量
2016/06/02 Python
python学习基础之循环import及import过程
2018/04/22 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
python构建指数平滑预测模型示例
2019/11/21 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
keras中的卷积层&amp;池化层的用法
2020/05/22 Python
python 如何快速复制序列
2020/09/07 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
大学校园生活自我鉴定
2014/01/13 职场文书
《大海那边》教学反思
2014/04/09 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
老干部工作汇报材料
2014/10/28 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle