数学建模社区-数学中国

标题: 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 M3、重复以上 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' iview source9 p# a1 l" y( I% A0 m
print?
3 \" R/ n3 p. c/ p, ]1 r# z
& y  d/ g3 [- X01.function create_password($pw_length = 8)
7 f4 z+ s& t( m' n! c$ N02.{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& r05.    {/ 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. q11.// 调用该函数,传递长度参数$pw_length = 6
/ N; j. E) R: v8 Z# `' z0 E12.echo create_password(6);
4 M+ W6 A; D' [# @) R# P7 V5 ]$ h8 x7 H0 p" J
) ~: Z+ x2 D6 O7 K
方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
8 o# w% g  d5 A2、在 $chars 字符串中随机取一个字符7 j" F  g) Y2 F
3、重复第二步 n 次,可得长度为 n 的密码
. o! l! B) u2 o. Sview source
6 c5 L- x' p( ?$ Mprint?
& ^- 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 Y02.    // 密码字符集,可任意添加你需要的字符+ `- @$ c1 o# L
03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
! q0 c! N! d8 _6 M. t04.
/ z; _+ P: t: h' P05.    $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/ v10.        // 第二种是取字符数组 $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% ]* K13.    }
8 @* q' I- \# d5 ?* O! V14.
5 F0 P/ I% e& C$ O% J15.    return $password;
: l$ C- P( s8 f; M% ~6 l" d16.}+ 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 c2、通过array_rand()从数组 $chars 中随机选出 $length 个元素/ M1 Z: F  W/ y& R( w7 B
3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
: u" u, \4 c; a9 Q0 I0 K1 r# kview source
4 r$ C7 C6 r% ^: Q; C9 M9 Jprint?- 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 t05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
) E1 E, I3 r# Z- I% U06.    '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 C09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
( j; @; L- q, H' B: H5 D; y, G10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',   O. N% F6 a9 n: j
11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 4 A8 s& S, u' ?. i- o! G4 E
12.    '.', ';', ':', '/', '?', '|');
3 d, @" E  s3 M* f13.
+ u0 Q3 l! t( T$ I14.    // 在 $chars 中随机取 $length 个数组元素键名
! b9 c7 I$ k: F! l# ~( G15.    $keys = array_rand($chars, $length);
# S# @7 [  S% {9 L! |0 j$ [' s# H) J16.
+ l, Z* A: E# h' Y3 w0 z17.    $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; z21.        $password .= $chars[$keys[$i]];
! K5 w! t+ s, w( o- O; g9 B' h, e7 K22.    }
  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) L25.}' 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 ^: e2、将第一步获取的时间戳进行 md5() 加密
( {) H6 r8 \! v( m$ a7 Y3 D6 e2 D3、将第二步加密的结果,截取 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 }& W2.{# b6 r5 E( L& p/ T7 C1 G) \
3.    $str = substr(md5(time()), 0, 6);
4 h# X4 [  N' a4.    return $str;
3 k" n8 ^+ \3 R4 P9 S( v- ^9 q5.}# 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# Mview source( ?7 e6 R, a/ w9 p/ C, ~
print?
& V+ b2 f9 ~1 N1 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 k06.}. L' n; [5 ^1 K, y; p  ?, L
07.
/ c4 |5 H6 A, F08.// 记录开始时间
) h9 O3 Z8 O" G. P09.$time_start = getmicrotime();
2 m6 }. z$ d6 D2 Y5 W9 r" Q10. 2 W0 p0 E; Z4 r! ]$ @0 w
11.// 这里放要执行的PHP代码,如:
2 r3 W0 ~. ?5 B' g" O12.// 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; J19.echo "执行时间 $time seconds";
* \/ A0 X  n. W# \' D$ {; {6 \. P20.?>
' 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