数学建模社区-数学中国
标题:
PHP生成随机密码的4种方法及性能对比
[打印本页]
作者:
曾经的王者
时间:
2015-4-30 14:14
标题:
PHP生成随机密码的4种方法及性能对比
方法一:
1、在 33 – 126 中生成一个随机整数,如 35,
$ h1 X5 w" v& P7 q. F; G9 e: B
2、将 35 转换成对应的ASCII码字符,如 35 对应 #
2 k9 f- `3 Z9 o" m3 o' Q( E# H2 M
3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
* ]5 L$ u+ c; l2 w" `
该算法主要用到了两个函数,
mt_rand ( int $min , int $max )
函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考
ASCII码表
;
chr ( int $ascii )
函数用于将对应整数 $ascii 转换成对应的字符。
2 h! }! ^; M' i
view source
9 p# a1 l" y( I% A0 m
print
?
3 \" R/ n3 p. c/ p, ]1 r# z
& y d/ g3 [- X
01.function create_password($pw_length = 8)
7 f4 z+ s& t( m' n! c$ N
02.{
9 K5 b, ]' z# N( p
03. $randpwd = '';
8 h5 E/ ]; Y; r5 }9 p; [
04. for ($i = 0; $i < $pw_length; $i++)
; j6 ~" t* p# _& U& r
05. {
/ w" ]* K8 Y5 w, s& F1 k
06. $randpwd .= chr(mt_rand(33, 126));
4 S6 l/ C, F* @' N5 b
07. }
) [# A8 D* t7 c" h9 t! D2 a. \
08. return $randpwd;
, U: c l, v! U6 V8 w. }
09.}
$ z1 i) d6 z% k
10.
5 Q* _# f3 b8 c7 X. q
11.// 调用该函数,传递长度参数$pw_length = 6
/ N; j. E) R: v8 Z# `' z0 E
12.echo create_password(6);
4 M+ W6 A; D' [# @) R# P7 V
5 ]$ h8 x7 H0 p" J
) ~: Z+ x2 D6 O7 K
方法二:
1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
8 o# w% g d5 A
2、在 $chars 字符串中随机取一个字符
7 j" F g) Y2 F
3、重复第二步 n 次,可得长度为 n 的密码
. o! l! B) u2 o. S
view source
6 c5 L- x' p( ?$ M
print
?
& ^- f% } U+ @4 A/ R' V8 m
. I s7 d7 W: w/ v9 r X
01.function generate_password( $length = 8 ) {
0 E/ n0 Q& L0 Y
02. // 密码字符集,可任意添加你需要的字符
+ `- @$ c1 o# L
03. $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
! q0 c! N! d8 _6 M. t
04.
/ z; _+ P: t: h' P
05. $password = '';
1 U* A0 [6 B1 W
06. for ( $i = 0; $i < $length; $i++ )
6 F3 E2 X0 r0 T; B7 e* I+ b& _
07. {
2 z4 A6 Z$ q2 T0 t# ?
08. // 这里提供两种字符获取方式
$ C4 } w; s5 H7 f" v0 m
09. // 第一种是使用 substr 截取$chars中的任意一位字符;
, X( |2 t! F- W/ v
10. // 第二种是取字符数组 $chars 的任意元素
/ w; E3 R7 G7 V9 n# R& g# ~' R
11. // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
- m/ X; j3 @5 T
12. $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
/ Z/ q) ]+ x# l% ]* K
13. }
8 @* q' I- \# d5 ?* O! V
14.
5 F0 P/ I% e& C$ O% J
15. return $password;
: l$ C- P( s8 f; M% ~6 l" d
16.}
+ A" f4 V3 H" E/ g9 U: }: @
- y9 U( |* z6 ~7 P
& a! O E8 w& H0 z* k/ c' ]: ~
方法三:
1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
# V4 ]+ P! w4 v0 c
2、通过
array_rand()
从数组 $chars 中随机选出 $length 个元素
/ M1 Z: F W/ y& R( w7 B
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
: u" u, \4 c; a9 Q0 I0 K1 r# k
view source
4 r$ C7 C6 r% ^: Q; C9 M9 J
print
?
- s/ L: o) e- A6 T* x# Z ~/ [# {
; I* o- x7 Y; l% r
01.function make_password( $length = 8 )
% K2 f4 n! h: m% c W8 i
02.{
7 c3 o1 b! J& D, W/ U6 I% ^
03. // 密码字符集,可任意添加你需要的字符
/ \- O' e. O8 n4 e- ]
04. $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
; t8 j4 Q) J- _% c. P6 t
05. 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
) E1 E, I3 r# Z- I% U
06. 't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
# u. M6 g4 I# ?( _" ]
07. 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
) T( B2 [$ r6 J
08. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
/ J3 ], H X, W2 B6 C
09. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
( j; @; L- q, H' B: H5 D; y, G
10. '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
O. N% F6 a9 n: j
11. '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
4 A8 s& S, u' ?. i- o! G4 E
12. '.', ';', ':', '/', '?', '|');
3 d, @" E s3 M* f
13.
+ u0 Q3 l! t( T$ I
14. // 在 $chars 中随机取 $length 个数组元素键名
! b9 c7 I$ k: F! l# ~( G
15. $keys = array_rand($chars, $length);
# S# @7 [ S% {9 L! |0 j$ [' s# H) J
16.
+ l, Z* A: E# h' Y3 w0 z
17. $password = '';
* [4 D, ]! N# R; ~8 x' E; \: ]
18. for($i = 0; $i < $length; $i++)
" [, q+ F# R" C( d; A4 _
19. {
Z9 I y- O7 a/ `4 E x
20. // 将 $length 个数组元素连接成字符串
( e% l6 [6 F+ @0 Z; z
21. $password .= $chars[$keys[$i]];
! K5 w! t+ s, w( o- O; g9 B' h, e7 K
22. }
c; I3 E& B$ A; `0 I6 M: i: O9 W+ ?
23.
: d& {+ e1 [/ i, V" l3 L' o3 Y
24. return $password;
( w8 K5 l' M7 X) S6 P5 B8 U) L
25.}
' Z) M' [ o' V( \, ^
* c3 w9 \% K4 Z1 t- h1 c$ _
% I. E& k. \- r- l! i: z% C* }
方法四:
本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
, l& d, A5 \5 n" |; z
1、time() 获取当前的 Unix 时间戳
2 \. d& y5 p* l h! {: k6 a; h5 ^: e
2、将第一步获取的时间戳进行 md5() 加密
( {) H6 r8 \! v( m$ a7 Y3 D6 e2 D
3、将第二步加密的结果,截取 n 位即得想要的密码
: U& R$ z) g+ y" Q$ P* {
view source
) }2 A" ?4 j# ?0 V9 R+ Y# l3 q
print
?
4 k6 l2 e2 [4 A; D/ f7 D2 Y7 {
" S4 \- L* h+ i8 W
1.function get_password( $length = 8 )
2 o4 u2 ?- ]8 }& W
2.{
# b6 r5 E( L& p/ T7 C1 G) \
3. $str = substr(md5(time()), 0, 6);
4 h# X4 [ N' a
4. return $str;
3 k" n8 ^+ \3 R4 P9 S( v- ^9 q
5.}
# m8 D5 n$ e/ w3 u7 R
2 @+ S9 \# P/ u- o
; d# D( v+ F" V* S7 p& S
时间效率对比
我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
2 \) |: U1 `/ m' b# A3 W# M
view source
( ?7 e6 R, a/ w9 p/ C, ~
print
?
& V+ b2 f9 ~1 N
1 Z) b- N L5 J8 P( I1 e- G
01.<?php
8 ^, d& h" U# ^
02.function getmicrotime()
4 _1 ^/ c3 F: d
03.{
* i, z, O0 p- s9 ~% | [ V6 K7 [
04. list($usec, $sec) = explode(" ",microtime());
( h2 G6 S. [+ u9 _3 _$ e. @
05. return ((float)$usec + (float)$sec);
# @. V7 s0 H5 b2 _3 k
06.}
. L' n; [5 ^1 K, y; p ?, L
07.
/ c4 |5 H6 A, F
08.// 记录开始时间
) h9 O3 Z8 O" G. P
09.$time_start = getmicrotime();
2 m6 }. z$ d6 D2 Y5 W9 r" Q
10.
2 W0 p0 E; Z4 r! ]$ @0 w
11.// 这里放要执行的PHP代码,如:
2 r3 W0 ~. ?5 B' g" O
12.// echo create_password(6);
. l; s+ u* y o- F
13.
6 K+ ` A# _; ]* S
14.// 记录结束时间
! G- K; ]# t' o# [- L
15.$time_end = getmicrotime();
S- t- }8 p/ Y4 N+ e U7 h$ a) F
16.$time = $time_end - $time_start;
+ T9 V& {+ [0 o1 g
17.
0 d3 c4 W" m" t
18. // 输出运行总时间
4 Q t3 ^+ V) }5 r3 _6 Q# l8 Z; J
19.echo "执行时间 $time seconds";
* \/ A0 X n. W# \' D$ {; {6 \. P
20.?>
' P/ t6 p# O6 ^# o' g" A- ]
( g$ j# @* `" j/ `6 X+ P
8 T; r/ t5 ]; `& f$ Q$ t
最终得出的结果是:
/ j3 o: `, z9 x/ G' ?6 b
方法一:9.8943710327148E-5 秒
$ s- ]3 x7 a1 @7 J! H0 H6 a% o
方法二:9.6797943115234E-5 秒
. W5 a) s7 x: J. |/ q( f
方法三:0.00017499923706055 秒
: |) s( O }: V( ]( ]
方法四:3.4093856811523E-5 秒
& n/ m: B* `4 ]6 _& D
可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
) w, P8 s- W: \/ ?
C" c$ M; _" ~# R% x8 a" c# \
0 I0 F# a F& C' A! k1 R
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5