数学建模社区-数学中国

标题: 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& C07.    }
2 I1 a; k7 s. `! s+ X08.    return $randpwd;
$ J6 ?! c7 ^" p- k4 @( p09.}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 source1 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 A03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
0 E7 u) b; f0 R/ [8 v- E04.
$ Y1 a2 n; l/ M  l' ?7 T" D05.    $password = '';
" ?2 h1 p2 a3 b3 V06.    for ( $i = 0; $i < $length; $i++ ) 4 M' \! W  P. @$ w
07.    {# U3 S( }: ^& H3 T' _9 s
08.        // 这里提供两种字符获取方式
, S4 @) U1 [  a7 a( ~& }2 D09.        // 第一种是使用 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 f12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];6 V- n0 E/ \. k1 {* N
13.    }
1 J2 w6 C9 P+ B- O' X8 Q0 d14. , \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 P3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
2 G* ]% }, D) h' pview source
# i; n1 z. `: W+ H3 _, Fprint?. 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 e03.    // 密码字符集,可任意添加你需要的字符* 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 ]) L09.    '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: y16. + |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% c21.        $password .= $chars[$keys[$i]];
1 @7 j5 _% o8 I22.    }
- N9 Y6 A: F. @/ E# i23.
7 ?3 ~  V) y  X" F. B  `" G24.    return $password;
4 z, Y% ]3 n4 I% b25.}4 e* c6 `/ Z" k3 |8 [
+ A# `7 M! x  I7 Y1 J  q

3 @- _1 A# |- b6 ]方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
# j+ x/ R9 U: R* z1、time() 获取当前的 Unix 时间戳+ J. z; r$ d) [/ ~8 v8 g6 N2 j
2、将第一步获取的时间戳进行 md5() 加密
: H3 {3 a: j' x4 l1 T; @$ _" l3、将第二步加密的结果,截取 n 位即得想要的密码
1 }3 p' p6 i' kview source
8 C; W1 o7 ^& T* q/ L+ m4 ?print?
. o3 ?2 @1 G7 T# _
4 w9 ?: j* ]  F; x8 l) G! C1.function get_password( $length = 8 )
& h: _, {" m; w7 r. B2.{
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# n5.}
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) w03.{
! N5 C( f  j7 [5 |+ e) D04.    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# Y06.}& U) X; v4 g# Y! j* k7 C
07.
) L: c6 p1 ~+ `  c, |  h2 v7 P3 X08.// 记录开始时间
. \9 H9 _2 I% T4 @09.$time_start = getmicrotime();( j2 n$ g) ^; Y3 B; Z9 [
10.
' p2 ?% b& |+ C) l+ N11.// 这里放要执行的PHP代码,如:( @4 a) L/ c5 x2 @! w$ f
12.// echo create_password(6);
. j4 i, o9 y8 l# ~5 C13. 7 a: y3 e  }2 b6 e: R) x
14.// 记录结束时间
+ k. `; w. a3 z2 D# E15.$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 S20.?>
* 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