数学建模社区-数学中国

标题: PHP生成随机密码的4种方法及性能对比 [打印本页]

作者: 曾经的王者    时间: 2015-4-30 14:14
标题: PHP生成随机密码的4种方法及性能对比
方法一:1、在 33 – 126 中生成一个随机整数,如 35,
' x2 Z% n4 `! L, y& m. @2、将 35 转换成对应的ASCII码字符,如 35 对应 #
0 R3 g$ v! h4 U3 W3、重复以上 1、2 步骤 n 次,连接成 n 位的密码" g: J7 W% u' d$ f$ D
该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。8 {8 r7 D  y' U1 w4 K  u4 v
view source( Z7 U) N3 W7 W: f# f
print?- E: K! |) A. M' N# w
; S1 e) L$ S& E+ q9 D) A) Y5 E
01.function create_password($pw_length = 8)
5 k# B/ [+ Q$ o) E% a6 z02.{
" K6 U4 K1 s4 Z# D! m03.    $randpwd = '';% V% d2 g- P, {% Y1 I4 J; T
04.    for ($i = 0; $i < $pw_length; $i++)
- h% g+ m2 r8 {  h05.    {
- i+ V' B0 ?* ]: S+ P06.        $randpwd .= chr(mt_rand(33, 126));
. b' N" o- Q" K& J) K) k07.    }
9 x$ J, j3 V% L- M' O& H08.    return $randpwd;
) o8 s6 S# W4 @9 [9 D1 r09.}+ ]2 }  y! S1 |4 Y
10. * H+ ^, O7 U3 B' D
11.// 调用该函数,传递长度参数$pw_length = 6
% _  ]  K* _$ E12.echo create_password(6);
* P) Y. m; S  i+ _# j& B" |4 T3 W+ a$ ?: ]( u( m

4 j% A8 a' b" g. G3 y( q/ p方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
2 h" Q9 Y/ q' b; B; b2、在 $chars 字符串中随机取一个字符
$ A5 B+ J" f4 c3 l8 [9 U& D7 y' r5 D3、重复第二步 n 次,可得长度为 n 的密码) o# u+ z; A( L6 f3 y. ]
view source
) }/ H; p4 m  ?- e- T/ s/ \& jprint?
" n; M6 Y/ k7 t7 y- J4 ]+ N
$ M/ C8 g; t8 l' D' j3 R( y01.function generate_password( $length = 8 ) {
, E& ^0 y. p1 ~& d9 l/ i02.    // 密码字符集,可任意添加你需要的字符
. t: C: d/ U* t# T# q, _03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';! c- V0 T% c8 T/ E2 N
04. 8 c4 Z2 V. b6 F  r1 W; L
05.    $password = '';( R/ z& e, n4 Y  S# K( j
06.    for ( $i = 0; $i < $length; $i++ ) : Y5 J/ L2 J, f
07.    {7 R0 V. i1 H" E) Z
08.        // 这里提供两种字符获取方式4 Z2 E; E6 ?: X# ]1 Y+ }2 r/ G  J+ ~
09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
& ?5 F; z' o; \) w10.        // 第二种是取字符数组 $chars 的任意元素! x& @1 }% F! c& {- |
11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
" C" h4 Z  J6 B2 ~12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
' s. J% @3 X. N, C8 g( B" q" L- Y13.    }: |; q( v; h. R( |) u: v
14. / V  t1 |3 H2 S, T
15.    return $password;
5 ?4 T- h! l  t3 l! |+ H3 y& u16.}
9 M" X- h2 [; V" j$ O4 u# L
/ ?, O5 o9 |$ I2 i0 @, F, p6 P. W$ n. ]: E5 s
方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
0 l+ Z: o. s3 u  |% R2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
6 k5 G4 U9 u- X3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
* z+ M) k3 v/ _# P' R! d. iview source! n1 w  ]0 W% S3 S' P$ `0 m
print?
1 T$ F7 [3 a3 @' [/ ?6 E, L$ }7 m; j5 V" m; _
01.function make_password( $length = 8 )
4 ~3 w5 u+ Q% `, C" ]02.{1 v6 z/ o( j; S/ l5 X# I
03.    // 密码字符集,可任意添加你需要的字符$ W4 v$ N7 a& C2 O- o$ P
04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
0 i' O/ }# I8 ?# |1 V05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', + N/ n  c/ Y  f5 A: b  s+ p6 k2 H
06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', % D/ i9 N' {$ s/ M7 W  o
07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', , @% _3 @1 J8 ^& Q
08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', + \  x  E9 c% l
09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
1 I9 i' B2 V- t1 m  o6 c! X& Y, p  X10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
3 C) Z9 i: v( L7 a$ {! O- j11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 8 t$ |0 f. |4 Y: U# x3 h( E
12.    '.', ';', ':', '/', '?', '|');! |" E5 ~1 }, |2 j% v# [
13.
- i% o  l( J4 m" T9 I0 b7 [14.    // 在 $chars 中随机取 $length 个数组元素键名
1 Z: [' ]7 h' M5 m& Q+ _6 O+ }15.    $keys = array_rand($chars, $length); * s, z2 ^2 [1 B# Q+ a* B+ m
16. , i+ ?4 u( E! M! V; g7 x
17.    $password = '';
0 t% K: J* r8 Y7 i. m- S! N7 f( f9 q18.    for($i = 0; $i < $length; $i++)2 g  a' |8 R( a% C1 p: i' w
19.    {
8 R6 M3 v! o  x9 A$ T/ }20.        // 将 $length 个数组元素连接成字符串
, }- W6 b/ g8 r3 H' Q+ l21.        $password .= $chars[$keys[$i]];
0 G& B0 D( g, A% }$ u: b5 R  b; P22.    }
4 a0 Z% }4 K+ @6 s+ {6 H23. ' u- ]4 w- D, D* r
24.    return $password;, l: Q  r. ?' Y: H
25.}
7 h1 @3 U8 l1 N( N1 i- @& e' m6 g8 Y. F6 V" [6 E- H

, R9 }8 g0 S3 E& i2 @方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:+ C$ y# }; I- p! ?+ L' c9 m+ Z
1、time() 获取当前的 Unix 时间戳
: h$ M7 M# t1 g1 a' n  J+ v8 D; I2、将第一步获取的时间戳进行 md5() 加密
; x8 I9 |& B0 Y$ r' |% N& e& P3、将第二步加密的结果,截取 n 位即得想要的密码' o/ K# k0 R+ u* a; |* s  T
view source/ T1 i) L- A! G# Z- o
print?; k) v$ h$ [1 K% @* ^; O
+ P0 @3 x- v, @( P$ ]# q& P
1.function get_password( $length = 8 ) % B& R$ Y" [) m+ P  G# X- S! b
2.{
% |- I6 r  f$ n! }2 K4 t* b3.    $str = substr(md5(time()), 0, 6);
9 m  W& M$ O" @+ Y, G6 o4.    return $str;
$ ~- b. E0 n" d, P/ p5.}! f# V! A1 ]7 }3 N. p, q
- a9 x6 F6 X$ U& b+ E9 H9 K
5 p+ y$ N! r8 e9 w4 E' P. K
时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。9 R; I  V# o' u9 |# h
view source
2 v6 M, k$ M/ {/ T5 }1 _print?
! U* B' U8 ?5 ~* q8 C4 W) U& F' v! w& T9 V+ c2 ~8 ^3 u7 b* ]
01.<?php! b% l: ~; T: Q5 y+ \5 O$ z9 W
02.function getmicrotime(); y! V7 o6 I" D# n- v$ `# D- B
03.{2 m, H8 g$ K$ ~# j
04.    list($usec, $sec) = explode(" ",microtime());
$ S& M7 A+ O* c6 `, p; z- U05.    return ((float)$usec + (float)$sec);
' k- h. Z9 j8 Y% u06.}
5 J3 t2 j/ a8 P/ R07.
/ S6 E& F0 V: k. ~4 |  C( ^) r08.// 记录开始时间
$ A( L5 H; @6 u09.$time_start = getmicrotime();
3 X6 u+ a& o8 A, S1 @: i# z1 ~9 f5 o10.
& I" G' G' U2 o3 K11.// 这里放要执行的PHP代码,如:  T# J# c( i$ |! ?/ e6 _
12.// echo create_password(6);
8 B9 Z/ R" D" t  z13. 5 g* U/ Z2 [: ~# r$ @# h" i4 f
14.// 记录结束时间# r4 ?* O+ X' w  f) D( T# E
15.$time_end = getmicrotime();
/ V; k' \+ H0 j7 Q. [" a16.$time = $time_end - $time_start;# B7 M* n5 R3 i! h$ l
17. 4 |9 ?$ b: d+ X* D1 `
18. // 输出运行总时间 4 L3 m' L% d8 s( v
19.echo "执行时间 $time seconds";9 ?; L5 `5 w# F1 `
20.?>
# i# n  S# i4 o/ |1 y: L2 W$ ~7 }8 z1 I. E

2 ?: `& V/ M! C9 H最终得出的结果是:
+ J0 p% q# I9 A方法一:9.8943710327148E-5 秒1 W9 E  F4 ]9 g2 P+ z
方法二:9.6797943115234E-5 秒1 k( d% u% q+ @% R
方法三:0.00017499923706055 秒' I9 h# m7 z; ]9 z# i: U' [
方法四:3.4093856811523E-5 秒4 i) @& \/ J8 f  b
可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
. B$ R0 b( }4 H8 W
9 @, c) v8 p3 ?
, Y8 R% K5 J8 T8 A1 M




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5