数学建模社区-数学中国
标题:
PHP生成随机密码的4种方法及性能对比
[打印本页]
作者:
曾经的王者
时间:
2015-4-30 14:14
标题:
PHP生成随机密码的4种方法及性能对比
方法一:
1、在 33 – 126 中生成一个随机整数,如 35,
! G- F; E2 B' b1 G
2、将 35 转换成对应的ASCII码字符,如 35 对应 #
: e- N) u7 u( F
3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
0 z/ @6 s( x9 I; ]2 E
该算法主要用到了两个函数,
mt_rand ( int $min , int $max )
函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考
ASCII码表
;
chr ( int $ascii )
函数用于将对应整数 $ascii 转换成对应的字符。
5 p# s6 z& f: e. x& f& |
view source
+ L1 L/ e& e0 {# Y; {. a9 i& e9 N
print
?
) Y. P$ A/ @& E! f, ~7 C2 Z' H3 L! \
3 O u( L8 e( [: y" ^6 L; Y7 t3 \
01.function create_password($pw_length = 8)
8 t E4 O1 R1 b2 o, J. q o4 V
02.{
/ t; y0 ]% D$ I1 c2 U$ d& P
03. $randpwd = '';
! U& F" n: U8 J+ x6 J
04. for ($i = 0; $i < $pw_length; $i++)
/ U+ E e1 S& F
05. {
4 b" N$ h# o6 t- X
06. $randpwd .= chr(mt_rand(33, 126));
+ o0 P1 L* z6 ^9 V1 b& C
07. }
2 I1 a; k7 s. `! s+ X
08. return $randpwd;
$ J6 ?! c7 ^" p- k4 @( p
09.}
0 `) t1 q8 ^. {/ k
10.
6 K& \) E0 x3 a Z5 _
11.// 调用该函数,传递长度参数$pw_length = 6
( V+ _+ M3 p0 m" {: L
12.echo create_password(6);
' R; p& @$ G/ X# D8 L: ^
& {1 @) D, O+ b
9 ~* f4 Q, b( {4 Y
方法二:
1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
3 D4 a8 s5 P+ h# C, Y; F
2、在 $chars 字符串中随机取一个字符
! [$ e$ f. g+ ]) m9 h L9 |4 O
3、重复第二步 n 次,可得长度为 n 的密码
) j: t" L( |% |! m4 s1 J3 p4 J }1 T
view source
1 w# h8 \0 y# p2 M6 `
print
?
7 k6 C2 v! o [! I- w
( C8 F6 |/ g; W+ V$ p- \/ x; A ~
01.function generate_password( $length = 8 ) {
: @6 J' L5 g6 P0 u
02. // 密码字符集,可任意添加你需要的字符
7 @3 @/ l* O. _1 A
03. $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
0 E7 u) b; f0 R/ [8 v- E
04.
$ Y1 a2 n; l/ M l' ?7 T" D
05. $password = '';
" ?2 h1 p2 a3 b3 V
06. for ( $i = 0; $i < $length; $i++ )
4 M' \! W P. @$ w
07. {
# U3 S( }: ^& H3 T' _9 s
08. // 这里提供两种字符获取方式
, S4 @) U1 [ a7 a( ~& }2 D
09. // 第一种是使用 substr 截取$chars中的任意一位字符;
" d% \) E+ V1 p |
10. // 第二种是取字符数组 $chars 的任意元素
. G( D( n1 v! h5 z$ {
11. // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
' a% O/ _# s) }; z/ [2 U. X& {3 b9 f
12. $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
6 V- n0 E/ \. k1 {* N
13. }
1 J2 w6 C9 P+ B- O' X8 Q0 d
14.
, \9 }$ E4 J1 M
15. return $password;
; P6 S3 N3 J+ H
16.}
% ]0 K n! x- D" @
; c& q2 Y6 j9 n
2 F- P: B: z) v M9 E( [: v
方法三:
1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
- N) G, Q; f5 q I6 I/ H ~9 \
2、通过
array_rand()
从数组 $chars 中随机选出 $length 个元素
- K$ y5 W' W- h$ ]+ \6 P
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
2 G* ]% }, D) h' p
view source
# i; n1 z. `: W+ H3 _, F
print
?
. h; s4 |% y; D/ D
4 K4 K* W! @, H( ?4 O. c% Z
01.function make_password( $length = 8 )
4 B' K* a& b; I! Z6 m; y4 V' W
02.{
! H$ j4 b. F7 J& h2 O# k0 e
03. // 密码字符集,可任意添加你需要的字符
* w7 [( [0 |& y4 e
04. $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
; I: D8 [% K2 {+ D# {# d7 X
05. 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
1 j6 K$ ^3 Y! P& r! G1 \
06. 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
+ l9 h( e$ Z. D% f# f: N9 d6 U' K$ D
07. 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
8 n8 w4 U$ Z# j% f5 H8 ^) J
08. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
8 h) ~, ?9 ]) L
09. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
* O) l" ~8 [) D7 O1 B
10. '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
5 E6 {' K' L, G+ u$ Z% g1 i
11. '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
, O( J# t, N8 A- ~# y, [
12. '.', ';', ':', '/', '?', '|');
& i2 \6 C: M4 ^; C1 `8 b/ e
13.
, G6 F- t3 P0 V1 h7 O1 E" i. c3 w
14. // 在 $chars 中随机取 $length 个数组元素键名
" }' P) L1 e8 ?$ O
15. $keys = array_rand($chars, $length);
+ N2 S! ]8 V* f2 d( y6 Z: y
16.
+ |4 N9 H7 K. q; L
17. $password = '';
1 V. @) i1 ~# r1 E+ ]
18. for($i = 0; $i < $length; $i++)
: a( I7 p8 Q: j
19. {
0 M+ K% `% }' T" U1 `, D1 v$ t
20. // 将 $length 个数组元素连接成字符串
3 q- J/ i- ` N0 N% c
21. $password .= $chars[$keys[$i]];
1 @7 j5 _% o8 I
22. }
- N9 Y6 A: F. @/ E# i
23.
7 ?3 ~ V) y X" F. B `" G
24. return $password;
4 z, Y% ]3 n4 I% b
25.}
4 e* c6 `/ Z" k3 |8 [
+ A# `7 M! x I7 Y1 J q
3 @- _1 A# |- b6 ]
方法四:
本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
# j+ x/ R9 U: R* z
1、time() 获取当前的 Unix 时间戳
+ J. z; r$ d) [/ ~8 v8 g6 N2 j
2、将第一步获取的时间戳进行 md5() 加密
: H3 {3 a: j' x4 l1 T; @$ _" l
3、将第二步加密的结果,截取 n 位即得想要的密码
1 }3 p' p6 i' k
view source
8 C; W1 o7 ^& T* q/ L+ m4 ?
print
?
. o3 ?2 @1 G7 T# _
4 w9 ?: j* ] F; x8 l) G! C
1.function get_password( $length = 8 )
& h: _, {" m; w7 r. B
2.{
9 S+ _( n" {8 L4 e, ^
3. $str = substr(md5(time()), 0, 6);
/ T9 b$ |* X# E9 F) o5 H, [
4. return $str;
- M- |& |- L* c6 [/ T$ g# a# n
5.}
9 S% V6 h9 g& j# o6 Y
! {6 q5 b0 E+ R6 F
" D0 L9 e6 I: _2 C$ n
时间效率对比
我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
4 ~& m* G2 [# [' ?6 H+ F1 X. ~
view source
. B% u! A1 `% T) S6 e4 I: P4 B& t
print
?
( R8 x* L6 r$ I H) X( r6 A
3 l$ Y* q- \4 }" O" I- i; W
01.<?php
# ?, w6 _1 l o& k
02.function getmicrotime()
$ F: X5 Y. [' h) w
03.{
! N5 C( f j7 [5 |+ e) D
04. list($usec, $sec) = explode(" ",microtime());
3 u1 j. V. c( [/ O
05. return ((float)$usec + (float)$sec);
1 @5 a8 q, H; `4 c( B# Y
06.}
& U) X; v4 g# Y! j* k7 C
07.
) L: c6 p1 ~+ ` c, | h2 v7 P3 X
08.// 记录开始时间
. \9 H9 _2 I% T4 @
09.$time_start = getmicrotime();
( j2 n$ g) ^; Y3 B; Z9 [
10.
' p2 ?% b& |+ C) l+ N
11.// 这里放要执行的PHP代码,如:
( @4 a) L/ c5 x2 @! w$ f
12.// echo create_password(6);
. j4 i, o9 y8 l# ~5 C
13.
7 a: y3 e }2 b6 e: R) x
14.// 记录结束时间
+ k. `; w. a3 z2 D# E
15.$time_end = getmicrotime();
3 g; E; e' J# @$ ~0 z. F7 p
16.$time = $time_end - $time_start;
6 H: ? C/ r9 e- w0 J9 h& ?/ t0 [
17.
) |4 g7 i+ a, c) _$ J. j! y! \
18. // 输出运行总时间
3 ]9 E5 m) ?. p; L; X4 h) U$ t1 k
19.echo "执行时间 $time seconds";
* J2 R2 {( s1 U5 Y4 S
20.?>
* U; p9 e: u9 x/ U, w
" r, X9 d! b( l
# S J+ V9 I5 r3 {5 _
最终得出的结果是:
3 V( d& K! A* V3 ]
方法一:9.8943710327148E-5 秒
q7 h r& n9 N: h" T
方法二:9.6797943115234E-5 秒
1 z0 m6 y. g1 g# O
方法三:0.00017499923706055 秒
( {2 r8 W4 j9 V' s1 b
方法四:3.4093856811523E-5 秒
: m" c' T4 t3 F
可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
8 `/ {5 m8 l' Q3 U# J6 `/ B: \
1 _5 w" G* S& b( J: A* k$ ^
# M2 \, |# p) _+ \4 H$ K% d
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5