数学建模社区-数学中国
标题:
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 I
view source
8 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' n
03. $randpwd = '';
/ i8 B7 U' R& n' U! h
04. 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 d
11.// 调用该函数,传递长度参数$pw_length = 6
3 ^3 H* j/ k w* A2 T- a5 B
12.echo create_password(6);
6 o( {5 p6 U6 n2 \
+ Q3 z+ f* V* D4 } a* q
2 ?; G- m( L" _
方法二:
1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
6 V% F- Z) E1 ?+ t3 a; T. {( f
2、在 $chars 字符串中随机取一个字符
" z/ P% w5 l2 ]8 c
3、重复第二步 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. O
01.function generate_password( $length = 8 ) {
: M. l9 z9 v) M
02. // 密码字符集,可任意添加你需要的字符
* L" h) S/ p5 ]
03. $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
# {2 B% p2 \1 J; S
04.
A o! S5 Y5 r5 E( X0 y
05. $password = '';
- s0 L2 x! F3 j$ Z) z
06. for ( $i = 0; $i < $length; $i++ )
! N7 X3 f' n$ M
07. {
) D7 J3 n8 ^" t; I
08. // 这里提供两种字符获取方式
" |2 m/ I- p3 q* s8 C
09. // 第一种是使用 substr 截取$chars中的任意一位字符;
. c9 {' d4 d& L# P( q" d |0 ^
10. // 第二种是取字符数组 $chars 的任意元素
( U; _7 Q# h: {7 R; C, f
11. // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
! [) |8 n- J) b7 d
12. $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) n
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
3 F, q# ~! D" n6 m
view 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! z
03. // 密码字符集,可任意添加你需要的字符
# r8 e3 @" O, U; R7 D9 Q: C) [+ A
04. $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
9 a% l0 }$ j5 m
05. 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
1 H8 O- L* I4 e& f3 j
06. 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
: p( T+ F6 E- b
07. '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. ^# U
10. '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
3 R$ I* i7 ^3 u% @) w9 P3 N
11. '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
" 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) b
15. $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+ A
18. for($i = 0; $i < $length; $i++)
! Y! h \1 W3 }* B% w' m
19. {
* \) M2 q- I# L
20. // 将 $length 个数组元素连接成字符串
0 s1 t/ g& [2 V# i& x
21. $password .= $chars[$keys[$i]];
: k7 N5 |& H7 t$ I9 Y
22. }
[6 K' j$ U3 ]3 N, g2 V
23.
7 A# K; D9 ?! k; q7 z$ m/ ^) h
24. return $password;
1 o6 g) Z3 y! T2 q. U
25.}
) 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 ]" F
1、time() 获取当前的 Unix 时间戳
2 t' O7 y& |* g3 U3 g
2、将第一步获取的时间戳进行 md5() 加密
# @/ `2 T8 X9 `) R1 n# Z3 F
3、将第二步加密的结果,截取 n 位即得想要的密码
, x% p* y% {0 c8 K+ D! {& k1 I* Y
view source
3 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 |) l
4. return $str;
/ Z/ f V- C$ B2 F
5.}
& 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 [( T
print
?
' H% }6 G2 {$ x* d$ C
3 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$ P
04. 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 L
08.// 记录开始时间
7 e" n8 N$ ?2 F+ k- m& C
09.$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 U
14.// 记录结束时间
2 k- I x3 A3 k% r
15.$time_end = getmicrotime();
0 C' W4 Y! s3 `4 M
16.$time = $time_end - $time_start;
6 j3 j- R Q7 G9 F
17.
6 E8 `; M4 K6 \9 v6 ~& |' _! x
18. // 输出运行总时间
: 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