数学建模社区-数学中国

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

作者: 曾经的王者    时间: 2015-4-30 14:14
标题: PHP生成随机密码的4种方法及性能对比
方法一:1、在 33 – 126 中生成一个随机整数,如 35,
/ s6 i' k) g( D9 N' @+ a: `2、将 35 转换成对应的ASCII码字符,如 35 对应 #( K# D' f3 V, X
3、重复以上 1、2 步骤 n 次,连接成 n 位的密码, H% H% ^$ L4 i- t. s- n( B4 X" R
该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。5 f; F, B6 L6 ?0 q. p! r; [
view source  v5 c$ K  |& j9 K% U$ P! m* s
print?: U; j) r: V' d% f, y$ k% V

! M: W( t" |9 E4 M9 W* K01.function create_password($pw_length = 8)
( y- P2 C) z, g* ~4 r/ e, L8 ]3 s02.{4 S1 r# e2 T  _# r0 l9 o
03.    $randpwd = '';) ]1 p) }6 @* ?1 p/ Q" Q* i$ T
04.    for ($i = 0; $i < $pw_length; $i++) 9 o! _! D3 w* Q# D" N, ]
05.    {
( v3 K. r8 |9 g* F06.        $randpwd .= chr(mt_rand(33, 126));! h3 z5 d  Q2 \+ L( m: j2 b" q
07.    }
2 B, Q2 H6 o* ?" M08.    return $randpwd;. P6 ?/ d* V+ L, y2 {! z9 x! c
09.}' V* x) w$ o1 m; w
10.   B/ p4 I$ J9 h  j; {7 y
11.// 调用该函数,传递长度参数$pw_length = 6
: Z( M3 \) l2 k* Q/ D; E12.echo create_password(6);; Q5 z- }* ], t2 o
# d& @, C1 x" W% U0 [, D
  g; y0 {7 x+ D0 F9 s8 h3 `1 S
方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符* j+ {! [5 P' x$ z' m! I) f
2、在 $chars 字符串中随机取一个字符
2 X) l& T- d5 @, {+ @6 N! }- v3、重复第二步 n 次,可得长度为 n 的密码
" f1 H0 f* X; E3 Y5 w+ g3 xview source) |( l- d. k' Y2 i$ D
print?3 Z* D9 R' B2 R. P8 E: t
- u" N/ }1 S- a4 c
01.function generate_password( $length = 8 ) {
6 v1 o) [1 b4 M# ^, N* `& S02.    // 密码字符集,可任意添加你需要的字符3 E6 d1 x/ h1 q( I' y8 R" h7 ^3 T. \
03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';$ c7 V% q7 ^* ]" H& L% Q
04.
7 |+ K3 |7 j1 j: T05.    $password = '';
. G  H; s2 y, a6 X) [06.    for ( $i = 0; $i < $length; $i++ ) * n0 e, f5 A- |6 R
07.    {* W6 m% m& x) w' v
08.        // 这里提供两种字符获取方式
  h: s) x% L8 Y09.        // 第一种是使用 substr 截取$chars中的任意一位字符;* d+ N  P( Z, s3 H& E9 p6 W  d2 S
10.        // 第二种是取字符数组 $chars 的任意元素' Z- f9 g( a* o2 [' _0 E  u6 S2 t
11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
! ?# K4 Z2 V; ~) N12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];% y" v. N' |$ r. I" _0 s* ?
13.    }+ q/ I1 y5 f3 h, p: w# R5 P4 U
14.
( r1 a9 R. G$ `" `* W- u7 v15.    return $password;
% g. n. N5 A1 V  {, n, k16.}
6 p# r# m8 X. b9 g- C0 P( z' U4 H8 H+ D, C$ o! d0 E6 u
! h9 R; E8 [( }, W6 |+ T8 J" d* C
方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
4 m8 U+ F9 z0 G/ ]" {2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
* ~" h  t8 @! v/ }3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
' Z9 v  z. o! D, f5 X1 Iview source5 b5 @/ z" }4 T& D1 p9 s* d9 C
print?
$ F7 X& W, n  {' b6 Y' P! W3 v( s# l% J4 ^4 y& I
01.function make_password( $length = 8 )% U# U+ ?0 O4 t  y. m7 b
02.{% t- a3 V. J; M( i9 D- S
03.    // 密码字符集,可任意添加你需要的字符6 v* Y) X$ d4 p2 J, J0 q+ D
04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
5 Y7 E! b+ k1 e" F. d; U7 c6 o- O05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
" O: q; x2 N) g( l06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
0 l- T) M4 ~3 b3 @! W6 Q0 A07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
5 e, Q7 }5 ]" W08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',   _, z- ]2 ^" B( h# f/ l
09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
) ], j" d  q! K' o) [10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
) Q5 ^; \) K, @) K0 g11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',   b. V1 U' h+ Y$ I: Q7 E4 ]0 l9 r3 G* C
12.    '.', ';', ':', '/', '?', '|');6 x( i8 A% M, S) @# V
13. + }$ X+ l8 F2 B* Y% B  w( N
14.    // 在 $chars 中随机取 $length 个数组元素键名3 f' B7 U) |" s5 S$ m
15.    $keys = array_rand($chars, $length); : ]; ?, E) e0 e2 T
16.
3 |4 t- s! ?4 R9 ~* \2 [17.    $password = '';
% _5 {" C' B) e( |+ ]18.    for($i = 0; $i < $length; $i++)) q5 }/ ^+ D6 y
19.    {: D2 M  z2 U; t4 g+ S
20.        // 将 $length 个数组元素连接成字符串
5 K. S0 }' V' F7 Q$ j+ ~# d21.        $password .= $chars[$keys[$i]];
2 U& }/ l" l4 z: X- H2 ?( P22.    }
  h% @; c- `1 |$ @; o23. 6 q/ Q4 d: C7 y: z+ @6 i) d/ `6 s5 Z+ |* v
24.    return $password;
' G" x: D" o. U6 f, Q8 D25.}7 U% I; a/ f8 P2 G
0 q, Q! a  Z& Z2 i* O4 c- G

. N" `% y) X  p1 p! f方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:! T, y7 p  k) c! P1 B
1、time() 获取当前的 Unix 时间戳/ p4 ?5 r; y6 J, _  [+ i
2、将第一步获取的时间戳进行 md5() 加密8 Q% p! [8 y1 O0 R1 F
3、将第二步加密的结果,截取 n 位即得想要的密码* V8 r. N7 `) y
view source* J- G- ~0 y/ E: A5 h
print?  q' M- H( \! l% k' }" @

4 d( s1 J0 B6 Q  R7 f" H/ `1.function get_password( $length = 8 )
/ J# U8 f- b  y6 w% }* @6 A2.{
/ D: K/ l6 `: Z4 N3.    $str = substr(md5(time()), 0, 6);0 w2 `% l0 l; w& l9 {3 Y: `- `. M/ q
4.    return $str;
2 A0 ^, u/ J: @0 k1 j5.}. V3 T; C, P- {- ]6 U- W0 ~+ W
. U" g/ n% E9 @9 T8 Q$ E/ q
7 h5 ~. a/ h. C! {
时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。' Q3 R: T# D7 f8 l; r/ |
view source5 p+ ^' l2 ?+ F" l: I
print?. Z1 L8 L+ L, ]2 M; `

; R5 R" x; t6 G3 H& n! P01.<?php
; w. R) M- Y% K: X/ j* f! v, j02.function getmicrotime()- E" ?0 S* z( A2 [
03.{- o# f8 O- ^) R
04.    list($usec, $sec) = explode(" ",microtime());+ x- m) Y4 {! B$ S4 s# q" h
05.    return ((float)$usec + (float)$sec);
/ n& s; S. g/ T/ W06.}
7 N& o+ k8 }3 c! H3 t6 E3 ~07.
  f6 ^0 S7 a7 O  d1 ?+ I% F4 b08.// 记录开始时间! ^& f: l* X" E+ i2 ^
09.$time_start = getmicrotime();# v; \! S0 B. O, P
10.
, O( `1 F9 x5 ]) r1 _11.// 这里放要执行的PHP代码,如:* }$ r& |( S0 r, E( N
12.// echo create_password(6);7 u$ M+ t0 R# I( t
13.
0 O- p, ^, e3 ^( h' c14.// 记录结束时间8 o8 q( F# r) Z, O% T
15.$time_end = getmicrotime();
  w! }' C2 R0 ^16.$time = $time_end - $time_start;, @9 m* `: m4 t. Y/ o9 d" Z( U
17. # `2 S2 J% _; k% d! D# ?
18. // 输出运行总时间
# m  r% }% E, H- N! Z* A( k& J0 Q2 \19.echo "执行时间 $time seconds";: P# P1 d1 R; i+ f% W' _- r
20.?>
5 }+ d5 i3 Y& f& h2 v: g2 f% ?/ r- C6 B" |; P, d& p9 Z

& M% ]4 H/ m1 C$ y* E* D9 g最终得出的结果是:& i( ~: E1 G2 _7 j: o
方法一:9.8943710327148E-5 秒5 n9 f8 Q  U2 ]2 z
方法二:9.6797943115234E-5 秒$ T& X: d8 w( ^
方法三:0.00017499923706055 秒5 S& s- _- _9 e( a: N* F: k- O! x
方法四:3.4093856811523E-5 秒
9 F5 [0 R) J: ~9 e, a可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。- ^4 S0 m. F' c1 Q/ S8 `. l5 A2 t" \

( H6 l% i$ ^0 y" T/ _6 [0 T: e





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