数学建模社区-数学中国
标题:
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* K
01.function create_password($pw_length = 8)
( y- P2 C) z, g* ~4 r/ e, L8 ]3 s
02.{
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* F
06. $randpwd .= chr(mt_rand(33, 126));
! h3 z5 d Q2 \+ L( m: j2 b" q
07. }
2 B, Q2 H6 o* ?" M
08. 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; E
12.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! }- v
3、重复第二步 n 次,可得长度为 n 的密码
" f1 H0 f* X; E3 Y5 w+ g3 x
view 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* `& S
02. // 密码字符集,可任意添加你需要的字符
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: T
05. $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 Y
09. // 第一种是使用 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; ~) N
12. $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 v
15. return $password;
% g. n. N5 A1 V {, n, k
16.}
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 I
view source
5 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- O
05. 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
" O: q; x2 N) g( l
06. 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
0 l- T) M4 ~3 b3 @! W6 Q0 A
07. 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
5 e, Q7 }5 ]" W
08. '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 g
11. '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
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+ ~# d
21. $password .= $chars[$keys[$i]];
2 U& }/ l" l4 z: X- H2 ?( P
22. }
h% @; c- `1 |$ @; o
23.
6 q/ Q4 d: C7 y: z+ @6 i) d/ `6 s5 Z+ |* v
24. return $password;
' G" x: D" o. U6 f, Q8 D
25.}
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 A
2.{
/ D: K/ l6 `: Z4 N
3. $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 j
5.}
. 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 source
5 p+ ^' l2 ?+ F" l: I
print
?
. Z1 L8 L+ L, ]2 M; `
; R5 R" x; t6 G3 H& n! P
01.<?php
; w. R) M- Y% K: X/ j* f! v, j
02.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/ W
06.}
7 N& o+ k8 }3 c! H3 t6 E3 ~
07.
f6 ^0 S7 a7 O d1 ?+ I% F4 b
08.// 记录开始时间
! ^& 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' c
14.// 记录结束时间
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- C
6 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