数学建模社区-数学中国
标题:
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 W
3、重复以上 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 z
02.{
" K6 U4 K1 s4 Z# D! m
03. $randpwd = '';
% V% d2 g- P, {% Y1 I4 J; T
04. for ($i = 0; $i < $pw_length; $i++)
- h% g+ m2 r8 { h
05. {
- i+ V' B0 ?* ]: S+ P
06. $randpwd .= chr(mt_rand(33, 126));
. b' N" o- Q" K& J) K) k
07. }
9 x$ J, j3 V% L- M' O& H
08. return $randpwd;
) o8 s6 S# W4 @9 [9 D1 r
09.}
+ ]2 } y! S1 |4 Y
10.
* H+ ^, O7 U3 B' D
11.// 调用该函数,传递长度参数$pw_length = 6
% _ ] K* _$ E
12.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; b
2、在 $chars 字符串中随机取一个字符
$ A5 B+ J" f4 c3 l8 [9 U& D7 y' r5 D
3、重复第二步 n 次,可得长度为 n 的密码
) o# u+ z; A( L6 f3 y. ]
view source
) }/ H; p4 m ?- e- T/ s/ \& j
print
?
" n; M6 Y/ k7 t7 y- J4 ]+ N
$ M/ C8 g; t8 l' D' j3 R( y
01.function generate_password( $length = 8 ) {
, E& ^0 y. p1 ~& d9 l/ i
02. // 密码字符集,可任意添加你需要的字符
. 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; \) w
10. // 第二种是取字符数组 $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- Y
13. }
: |; 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& u
16.}
9 M" X- h2 [; V" j$ O4 u# L
/ ?, O5 o9 |$ I
2 i0 @, F, p6 P. W$ n. ]: E5 s
方法三:
1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
0 l+ Z: o. s3 u |% R
2、通过
array_rand()
从数组 $chars 中随机选出 $length 个元素
6 k5 G4 U9 u- X
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
* z+ M) k3 v/ _# P' R! d. i
view 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 V
05. '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 X
10. '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
3 C) Z9 i: v( L7 a$ {! O- j
11. '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
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 q
18. 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+ l
21. $password .= $chars[$keys[$i]];
0 G& B0 D( g, A% }$ u: b5 R b; P
22. }
4 a0 Z% }4 K+ @6 s+ {6 H
23.
' u- ]4 w- D, D* r
24. return $password;
, l: Q r. ?' Y: H
25.}
7 h1 @3 U8 l1 N( N1 i- @& e' m
6 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; I
2、将第一步获取的时间戳进行 md5() 加密
; x8 I9 |& B0 Y$ r' |% N& e& P
3、将第二步加密的结果,截取 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* b
3. $str = substr(md5(time()), 0, 6);
9 m W& M$ O" @+ Y, G6 o
4. return $str;
$ ~- b. E0 n" d, P/ p
5.}
! 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- U
05. return ((float)$usec + (float)$sec);
' k- h. Z9 j8 Y% u
06.}
5 J3 t2 j/ a8 P/ R
07.
/ S6 E& F0 V: k. ~4 | C( ^) r
08.// 记录开始时间
$ A( L5 H; @6 u
09.$time_start = getmicrotime();
3 X6 u+ a& o8 A, S1 @: i# z1 ~9 f5 o
10.
& I" G' G' U2 o3 K
11.// 这里放要执行的PHP代码,如:
T# J# c( i$ |! ?/ e6 _
12.// echo create_password(6);
8 B9 Z/ R" D" t z
13.
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. [" a
16.$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