QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2346|回复: 0
打印 上一主题 下一主题

PHP生成随机密码的4种方法及性能对比

[复制链接]
字体大小: 正常 放大

18

主题

10

听众

35

积分

升级  31.58%

  • TA的每日心情
    慵懒
    2015-4-30 14:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2015-4-30 14:14 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    方法一:1、在 33 – 126 中生成一个随机整数,如 35,
    6 A. }& M. a5 v6 `* a2 N2、将 35 转换成对应的ASCII码字符,如 35 对应 #6 E% B8 I  X& R( x4 |7 i7 v) B
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码+ c; b. z4 G0 }7 S+ B# k
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。, V1 L. z! j- \7 T; @+ l! b
    view source
    5 q7 P4 ?. q! X% m7 Aprint?
    4 W8 u7 \9 L- e$ ^# H3 ~3 @2 F! j% ~5 W* `
    01.function create_password($pw_length = 8)! o7 J; p" \6 x
    02.{$ M% |% e4 b# j* \
    03.    $randpwd = '';' m6 k/ x% e: }; T0 m1 b; w# r1 _
    04.    for ($i = 0; $i < $pw_length; $i++)
    ! s' i! V$ Y: Y* ^3 w/ v05.    {; n5 T4 Z2 c" K0 h7 E6 O* a9 N* u
    06.        $randpwd .= chr(mt_rand(33, 126));+ m. K) ]+ v4 k' Y. m# x
    07.    }" a( i% Z3 c: k2 C9 s  f
    08.    return $randpwd;
    $ `1 H5 g. g7 q3 b- V: `9 o09.}! \* O: @; L; G" M, L
    10.
    " w- ?8 v" `& G* c8 L1 K11.// 调用该函数,传递长度参数$pw_length = 6
    . _8 k* E1 R% ]# {8 A9 q3 G& J0 {12.echo create_password(6);
    $ Z. O3 v# \% t( b  i: H4 D; @5 @& C4 n
    * [8 M3 D" b# ^4 R9 |
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符% Q0 q, Z) Q* h( Q
    2、在 $chars 字符串中随机取一个字符
    2 p& M7 W. O' s0 Q* @" T2 G6 j9 v- F" `3、重复第二步 n 次,可得长度为 n 的密码6 H4 B: V% a9 g7 x3 ~9 S* @
    view source
    9 n- ~) ^) r  X5 y2 R! iprint?
    * F9 p6 O9 r/ M' F0 b- l$ Y! ~
    8 Z+ i4 f9 L) Y# O; l# F01.function generate_password( $length = 8 ) {
    ' e* ^) ~' q* w+ N8 j" h4 Z) P& A02.    // 密码字符集,可任意添加你需要的字符
    / \& |1 A% Q" e; a2 \$ D03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';# j# f  y0 k5 z. _! f
    04.
    8 X& b: f' G6 t4 n) }4 y' x# c05.    $password = '';
    * _' Z6 N- ?& K  s( ]( L06.    for ( $i = 0; $i < $length; $i++ )
    ; B: ~# h" I( p' I- ^, l07.    {1 \; _1 e' t& B6 k. ~
    08.        // 这里提供两种字符获取方式; K3 F3 o% @' f( q5 V
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;1 F" _2 D6 p& I" u. }
    10.        // 第二种是取字符数组 $chars 的任意元素; ?# }( ~. y4 P3 T; e" j  I$ c7 h
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);0 _' M' h* p, L# O
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    # b& I* I1 i* w13.    }8 z$ X6 \2 I; d5 e# X3 c
    14.
    & i4 ~# F, ?& c/ R6 z15.    return $password;( a' R) U* D, o; j/ v& Z
    16.}
    5 t( n( s1 F0 P- s* m4 N& C1 \  p4 f5 P2 S& T& W0 |
    2 G& Q2 H3 F. \1 q  X
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    , j5 ^) t% H5 N: J2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    ; Y% N5 d, N3 @0 ]* q/ H) A) S3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。& V' U( P( [( V7 R
    view source
    : m* @4 V4 Z, Jprint?0 ^. ~; I; \! z  x$ j3 t
    ! g5 x9 }7 _/ x# _/ u/ O
    01.function make_password( $length = 8 )' }$ a( x2 ^# f6 ]! j$ _. V+ O# G
    02.{
    1 M' o  ^# A0 d" ?2 I- x% i03.    // 密码字符集,可任意添加你需要的字符
    0 I% _3 U( [2 L0 Z  z0 o# [04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
      k7 A1 |7 g1 }( f: j( W1 ?5 r, D05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 9 h( x2 f6 {7 J2 R8 K4 _. m4 o* u
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
      V0 U& I, m9 u/ H* }07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 0 J1 ~! o: g0 t6 l6 L
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    , D" m- o* N& v09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    8 S1 U5 Z$ T& h! W& g10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    , _( h0 a1 x0 R) s  H+ e11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 6 q6 E7 F, `  C+ z$ j
    12.    '.', ';', ':', '/', '?', '|');
    5 o( G* ]" S4 j: m13.
    8 _3 ], _6 X. `* t) x. q14.    // 在 $chars 中随机取 $length 个数组元素键名
    + Z/ N2 v7 x7 h& y! t1 N" a15.    $keys = array_rand($chars, $length);
    6 q0 x' [; k$ g5 w5 C  v* C7 o" ?16.
    ' D; C% n$ k% V/ V17.    $password = '';
    8 _* z. {' `4 a% V18.    for($i = 0; $i < $length; $i++)# R' u: `9 i5 b8 D
    19.    {' Y& X7 n0 J2 w0 V& y! F# V
    20.        // 将 $length 个数组元素连接成字符串- c5 \8 `7 l2 j0 N3 r' K4 `; X
    21.        $password .= $chars[$keys[$i]];- B4 e" E( U( ^  x
    22.    }. E. H2 c. I! b1 }3 p6 C. w
    23. , ^4 O% A/ ?4 k2 i  r$ m# l& r
    24.    return $password;
    : v. s& W8 D5 G( I25.}( W. F8 _' N3 l; q9 n/ r8 x
    % z. ~" Z+ R- t5 p

    4 a; r9 K" F$ C7 }  q* l方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:- z* g. G2 U& G, n: ?# o9 M  P, F$ l8 i8 n
    1、time() 获取当前的 Unix 时间戳! s' @2 f( h* z+ ?+ l+ M1 P" J
    2、将第一步获取的时间戳进行 md5() 加密+ z2 L7 H" E: q8 h+ \
    3、将第二步加密的结果,截取 n 位即得想要的密码4 S9 q) Z9 n/ C. u" [0 X
    view source
    $ f' X4 H6 m& E; pprint?
    6 ?+ y. `- D% q  L1 |+ k
    0 y! Y3 G2 e5 S2 o$ f3 r) S- T1.function get_password( $length = 8 ) + O2 ^7 S1 V" C6 x/ w
    2.{
    ) ^# p7 A" r& \, A4 Y  O6 ]3.    $str = substr(md5(time()), 0, 6);
    , B9 s& d8 g9 k( j0 `4.    return $str;
    2 X# H( S; S' j/ Z6 U/ {3 N+ V5.}- i) i. m% t6 a( B( W3 f; A
    1 y) X6 h) N# X, l7 f! C

    % |- Y' V5 u; y7 w/ M+ R时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。1 j' d( a  B2 r% T
    view source# t! k+ ]0 n4 H# v$ Q9 L
    print?* Z- ?. \  D3 z
    1 V$ T+ [# m' l# e- O6 \! f. f
    01.<?php" ?) F* t, S) p% @2 s( H
    02.function getmicrotime(), m! h: y$ C. s3 w- H; k. E
    03.{
    , f- a1 M$ o- Y; Q! }04.    list($usec, $sec) = explode(" ",microtime());4 a2 {, V. O8 T/ F* S+ Q
    05.    return ((float)$usec + (float)$sec);
    ! [  o9 g5 Y4 [9 O9 k06.}% W* t. V' `# W0 x1 Z0 a% Z0 ]/ z
    07.
    : a" f  U7 d' v8 l, N08.// 记录开始时间0 q, k' J7 x2 I# _* h- P+ w
    09.$time_start = getmicrotime();
    " h3 D9 J7 W0 [0 }# P# u+ o" ]/ r10. . p6 ~) s. d6 W
    11.// 这里放要执行的PHP代码,如:# V8 F; y* U% |% b  q
    12.// echo create_password(6);
    6 q& k( B% m) f7 p% Y13. $ K) Q% V; u' `; j4 F; \5 N
    14.// 记录结束时间; n% s0 Y1 z/ ^- t) A
    15.$time_end = getmicrotime();
    " m9 b/ D8 a5 F4 n/ \& s16.$time = $time_end - $time_start;
    # k. N# o3 G& {9 l7 i' _* y  Y17. 2 }; l1 I; N3 ^9 n6 Y' y
    18. // 输出运行总时间
    / K8 n+ G& [& |3 j2 y19.echo "执行时间 $time seconds";7 m$ o! Y$ C3 X0 b7 N
    20.?>' i9 N0 e0 L5 H6 p/ C/ N3 f
    / G6 V# ]) z, i4 _

    + U: G3 Z0 C3 _最终得出的结果是:
    9 g3 o. ~8 r+ F+ \, @方法一:9.8943710327148E-5 秒0 W+ e6 q$ J( j' o9 x
    方法二:9.6797943115234E-5 秒4 }3 H4 x7 Z3 n" ?) b
    方法三:0.00017499923706055 秒
    0 B( J# q# p, n, p/ m0 s! C* O8 _+ [% V方法四:3.4093856811523E-5 秒
    - ?2 ~, f& `3 D可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。( p9 ~9 V( u  `* }# o+ ~0 t; D; X

    ) S( ^  ?1 N0 f( N+ E8 `. X
    * ^6 D9 L6 ?. S& m5 O9 L
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-4 12:59 , Processed in 0.419813 second(s), 55 queries .

    回顶部