数学建模社区-数学中国

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

作者: 曾经的王者    时间: 2015-4-30 14:14
标题: PHP生成随机密码的4种方法及性能对比
方法一:1、在 33 – 126 中生成一个随机整数,如 35,8 {6 w9 Y9 P% W% e* p$ B5 a
2、将 35 转换成对应的ASCII码字符,如 35 对应 #* K8 J* C* O5 h% p$ z
3、重复以上 1、2 步骤 n 次,连接成 n 位的密码, r; }' T8 A' a+ ]8 f6 h6 L( }
该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
8 y+ T; Q% f* \3 V" n2 Iview source8 Q' t6 \' J+ n- I. G2 U/ J0 o8 ^
print?- c: p4 q3 H, d* d2 t* U+ b
4 h4 {) z1 J! ~2 k- U
01.function create_password($pw_length = 8)/ r0 y, B9 }7 ~, p# b/ H6 R
02.{
4 }1 p- `) v" t$ x1 f) b; n' n03.    $randpwd = '';
/ i8 B7 U' R& n' U! h04.    for ($i = 0; $i < $pw_length; $i++) 4 Z  X& {& c* s9 x' m
05.    {! C# v1 O( w0 }& E! {
06.        $randpwd .= chr(mt_rand(33, 126));9 B/ M' L# ?; @
07.    }. G+ t4 W) k! G9 @& q) B  ^
08.    return $randpwd;6 W3 _/ a& b& P0 Q! \( Y% G0 X
09.}* K! a0 _& f- h& `
10.
4 h/ s: G( P2 d11.// 调用该函数,传递长度参数$pw_length = 6
3 ^3 H* j/ k  w* A2 T- a5 B12.echo create_password(6);
6 o( {5 p6 U6 n2 \
+ Q3 z+ f* V* D4 }  a* q2 ?; G- m( L" _
方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
6 V% F- Z) E1 ?+ t3 a; T. {( f2、在 $chars 字符串中随机取一个字符
" z/ P% w5 l2 ]8 c3、重复第二步 n 次,可得长度为 n 的密码2 p5 V% c# b3 Z2 w8 `% M' r( v
view source+ ~6 [( Q3 R, w3 t& z/ O) g
print?
# s! H# {9 C8 U8 a
! ~8 K% w/ R7 w+ P. O01.function generate_password( $length = 8 ) {
: M. l9 z9 v) M02.    // 密码字符集,可任意添加你需要的字符* L" h) S/ p5 ]
03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
# {2 B% p2 \1 J; S04.
  A  o! S5 Y5 r5 E( X0 y05.    $password = '';
- s0 L2 x! F3 j$ Z) z06.    for ( $i = 0; $i < $length; $i++ ) ! N7 X3 f' n$ M
07.    {) D7 J3 n8 ^" t; I
08.        // 这里提供两种字符获取方式
" |2 m/ I- p3 q* s8 C09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
. c9 {' d4 d& L# P( q" d  |0 ^10.        // 第二种是取字符数组 $chars 的任意元素
( U; _7 Q# h: {7 R; C, f11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
! [) |8 n- J) b7 d12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];6 y$ b6 r- _  O. R2 o6 @
13.    }8 V  X* x2 ]: Z
14. ! \3 l* H9 a% K9 P, ~
15.    return $password;" M1 x+ {9 _' [( z, K! k' {
16.}5 G# [( d4 I8 H- c  _
) m' r3 S2 z9 Z
; Y. A. z( n" \0 }9 F; M# ^
方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符+ v+ t- t6 f& f) h( ~- H5 @8 k
2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
$ j# q$ l2 x7 o) n3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
3 F, q# ~! D" n6 mview source; S# [. W+ S: y2 p( l( J* l+ z* q
print?0 D5 V/ u+ }" {7 V# L* c. o
1 U1 ^; Z2 l; n# N3 T
01.function make_password( $length = 8 )0 v( T- s  N+ ]4 w/ j# X
02.{
% @# H9 E* v9 o! z03.    // 密码字符集,可任意添加你需要的字符# r8 e3 @" O, U; R7 D9 Q: C) [+ A
04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
9 a% l0 }$ j5 m05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
1 H8 O- L* I4 e& f3 j06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
: p( T+ F6 E- b07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', % Q9 P9 ?) {. X! h  s: S$ Y
08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', % j( W5 _% h3 n
09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
4 e3 f: k6 f' g; x! Y' w. ^# U10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
3 R$ I* i7 ^3 u% @) w9 P3 N11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
" W+ L9 e; Z( I" ^6 U* Y: ?12.    '.', ';', ':', '/', '?', '|');# l) u7 j  u# e) b
13.
1 ]$ |5 s3 ^$ \$ A# a! I2 C% _14.    // 在 $chars 中随机取 $length 个数组元素键名
( @' Q" D1 s& A- A$ A) b15.    $keys = array_rand($chars, $length); 9 s6 u7 g  S9 r3 G- I- r
16. 0 {- n7 Z8 W( F* |* f5 [3 @# Q# k
17.    $password = '';
  _, K( K: X$ l+ A18.    for($i = 0; $i < $length; $i++)! Y! h  \1 W3 }* B% w' m
19.    {
* \) M2 q- I# L20.        // 将 $length 个数组元素连接成字符串
0 s1 t/ g& [2 V# i& x21.        $password .= $chars[$keys[$i]];
: k7 N5 |& H7 t$ I9 Y22.    }  [6 K' j$ U3 ]3 N, g2 V
23.
7 A# K; D9 ?! k; q7 z$ m/ ^) h24.    return $password;
1 o6 g) Z3 y! T2 q. U25.}) T7 h2 g: o5 B2 b  S

+ l# M* a, a' n0 g9 W, j8 w
9 q8 g5 @8 M3 q, \  V: u3 W- Y5 X* g方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
! K" X6 \# A2 \6 Q9 U% c  ]" F1、time() 获取当前的 Unix 时间戳
2 t' O7 y& |* g3 U3 g2、将第一步获取的时间戳进行 md5() 加密# @/ `2 T8 X9 `) R1 n# Z3 F
3、将第二步加密的结果,截取 n 位即得想要的密码, x% p* y% {0 c8 K+ D! {& k1 I* Y
view source3 D' N& G# N# }5 B2 C  C+ r& B
print?
$ a: e( @$ W# g! F0 S( W$ H% N9 L$ I3 r) w. G6 Q+ m2 O
1.function get_password( $length = 8 ) 6 ^$ A2 q$ ^5 Z7 I# k% U  ?
2.{0 l. V- y0 y% V1 Z0 R4 S5 B1 i. c
3.    $str = substr(md5(time()), 0, 6);
/ d$ J6 ]4 O# g; B* W  |) l4.    return $str;
/ Z/ f  V- C$ B2 F5.}
& F7 z* B) q% y* W5 |) C- I6 F# ^' A- J' v2 K% w
/ k" v6 V* Q! B3 a
时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。& i$ r6 U0 b; x0 ~( @- V% K3 P
view source
) U% |1 |% B0 ^4 [( Tprint?
' H% }6 G2 {$ x* d$ C3 L  w) v+ u& Z1 f& f: t# A
01.<?php" I$ C' O0 P1 r/ w0 v- S' q
02.function getmicrotime()$ O) w% C: O# _/ r0 O4 E0 J
03.{
; M% a6 i0 J5 p; p$ P04.    list($usec, $sec) = explode(" ",microtime());5 I3 \6 w; J4 \3 j% s0 }3 v4 t
05.    return ((float)$usec + (float)$sec);& N( o; Z9 n- b1 n) A
06.}
- M* d- A1 }3 P, {: \07.
! O( L/ f, }( h2 L08.// 记录开始时间
7 e" n8 N$ ?2 F+ k- m& C09.$time_start = getmicrotime();5 w6 ~. K, G- {* `* }; z% _9 p
10. 5 e. N% e, S9 L& c  Q
11.// 这里放要执行的PHP代码,如:1 c6 ?3 L# w* z' K5 i
12.// echo create_password(6);) R' m6 `( j1 z, l" D. J$ Y
13.
) ?( o4 Q  N' Q/ q7 U14.// 记录结束时间
2 k- I  x3 A3 k% r15.$time_end = getmicrotime();
0 C' W4 Y! s3 `4 M16.$time = $time_end - $time_start;
6 j3 j- R  Q7 G9 F17.
6 E8 `; M4 K6 \9 v6 ~& |' _! x18. // 输出运行总时间 : B- s5 r1 M, h. a4 L' p. l6 ^( `
19.echo "执行时间 $time seconds";' P, d9 ]! L: ^* _6 g
20.?>6 u4 _, o# o% _! b: _' l
1 r  f2 q* E* N# q% I! @

, W. {0 o0 ^3 r. n! F2 a# k1 _最终得出的结果是:, n% w. o2 N+ D+ D
方法一:9.8943710327148E-5 秒7 z% z# h3 Z0 j6 w5 }- ]( s% N# E
方法二:9.6797943115234E-5 秒/ \7 o8 c) O, _0 s
方法三:0.00017499923706055 秒
4 w" d4 j1 y. Z& u! @9 C方法四:3.4093856811523E-5 秒
, `! W  i5 D, P可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。4 ~; d3 c" L: T
& S- j; o' P- X% L

* q: R6 H; u2 S2 k2 D3 M




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