QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2347|回复: 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,
    8 m  u$ Y  M/ E1 M4 a2、将 35 转换成对应的ASCII码字符,如 35 对应 #% h+ T7 u3 \6 j
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    0 x  d0 Q2 ?# s3 S2 E3 [4 R该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。4 [0 G' N- @9 n$ F/ l6 G
    view source$ M" C5 h6 h5 [7 h+ x
    print?  M3 [9 B* H& k4 B
    ! d; r3 _  ?5 [  A- i
    01.function create_password($pw_length = 8). B' r: Y4 d  v
    02.{, J2 q8 E. e+ d( N7 ^
    03.    $randpwd = '';) _' W- `6 j8 m; W% T0 D
    04.    for ($i = 0; $i < $pw_length; $i++) ! h" a, c/ s: P9 d/ |0 A
    05.    {) H4 A& X7 }  z$ s2 g5 r
    06.        $randpwd .= chr(mt_rand(33, 126));  h2 C2 m" W% n5 |7 G$ }
    07.    }
    3 N( j1 J+ f; b6 T' F08.    return $randpwd;: f3 L4 _$ f. d7 X% m
    09.}
    4 O! }/ S+ Q; ~) _: j: U10.
    & T' r' p& f7 t) T2 [4 g11.// 调用该函数,传递长度参数$pw_length = 6
    ) r+ O! ]8 |: N. [, ^* E# I. \12.echo create_password(6);  q- y0 h& R: C

    3 G( n6 L. i( q; E; k( a' a
    5 q/ D/ Y! s7 i+ M5 w, e方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    5 ?8 U3 G6 _! s, S" ~5 ?2、在 $chars 字符串中随机取一个字符5 p3 `5 R: g: K( d9 o  M
    3、重复第二步 n 次,可得长度为 n 的密码
    ! X, S: M3 V' F" V& _view source" H/ X1 R9 D" H% |) A
    print?
    ' z3 e" `9 Q& h; {/ V7 |4 t& m& z4 [6 e3 U+ |, T) ?' z  |" w
    01.function generate_password( $length = 8 ) {/ D1 O3 N1 \% ~8 C6 |& c1 _. F* |" W
    02.    // 密码字符集,可任意添加你需要的字符( |; w1 ^' k9 K' j
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';- F3 i$ l1 {; Z: ?
    04. ) ~2 R: o$ r* i5 O3 x, d6 Y5 q
    05.    $password = '';
    ! m2 {4 h. m* v5 }+ W; Q06.    for ( $i = 0; $i < $length; $i++ ) # C( w8 h; D8 {9 C
    07.    {6 w- ^" S+ K! A) J/ O3 z
    08.        // 这里提供两种字符获取方式
    " L% G2 r+ ?) X* [( ]09.        // 第一种是使用 substr 截取$chars中的任意一位字符;) I: V' }1 D* A% l
    10.        // 第二种是取字符数组 $chars 的任意元素: I/ U0 t: e  s' g( q2 F
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    # F4 {: k2 V  ^1 @12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    8 a6 \' x; ^) l. }' @% H13.    }9 @0 ]7 o; b0 `: g. h
    14.
    6 Q3 ^- o% C9 d2 k0 |15.    return $password;
    1 D9 R2 X$ W! t2 t3 j% d5 j16.}
    : g6 w% j8 v9 C( t: S+ L
    % n. @9 [5 O9 Y% f$ a& i  H7 H/ L* F* m+ P2 }; h: j
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    . U% M% l" Z0 R# v9 `2、通过array_rand()从数组 $chars 中随机选出 $length 个元素  B2 ~+ Q- i- c: E
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。. D2 W1 d! Q+ C9 L
    view source* f6 X. N4 h1 x' C0 F& t
    print?  H/ A+ ]6 d- Y  k$ B* l
    % N) P* C/ O! ]
    01.function make_password( $length = 8 )
    + Z% S3 |: e2 j02.{
    ) ~1 F1 [5 Y* `3 N03.    // 密码字符集,可任意添加你需要的字符$ [2 x( j+ ^4 d6 A
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', " M  {1 i1 r; ]  ^3 ~
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    $ }9 j( o% c  y8 ?- i+ A( o/ r" Z6 ?06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    $ I3 y0 [' C: d. B07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    : c8 d* c; V& ~08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 7 P; m: n( v4 }4 }2 X
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', : y+ O, ?: l# a/ S, O- q
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', ) A8 l& o- p8 ]" `$ V
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 5 f% V* y$ f8 b& u. N- K
    12.    '.', ';', ':', '/', '?', '|');" p; V, P$ Q  R" j
    13.   X7 X8 J5 _0 f! T0 R4 Q% S
    14.    // 在 $chars 中随机取 $length 个数组元素键名
    . B' W$ w& q/ f0 L" s- q1 C15.    $keys = array_rand($chars, $length); + r/ t& S! I& ]  m+ g. \
    16.
    8 N; I2 ]5 v  y17.    $password = '';3 t: ?) f  _8 K9 N9 ^
    18.    for($i = 0; $i < $length; $i++)
    " B+ m, o1 Q* K' o5 W19.    {) L2 b0 k, m# c
    20.        // 将 $length 个数组元素连接成字符串
    ) k) a3 O. v7 L/ Q. t8 n21.        $password .= $chars[$keys[$i]];
    5 x8 w% o' c% j3 w! o+ _; u22.    }
    * S" ~* m# M4 K7 Y; v" k4 @23. & @2 T- I3 \1 m3 b. g! ]9 q& Q
    24.    return $password;
    3 M. R. t, z& I9 h/ y5 g: b25.}
    ! F" S6 B1 a, K; o8 |; z3 H" D+ p8 L, T& {4 r: I$ B% L
    2 w$ s) l! \2 \. _( n  M
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:- C7 D7 s8 [5 p
    1、time() 获取当前的 Unix 时间戳
    ! k0 |4 R* ]6 q" c  u2、将第一步获取的时间戳进行 md5() 加密% L: M, A8 E; X; V% k/ S
    3、将第二步加密的结果,截取 n 位即得想要的密码' [6 S' x$ m5 l  _7 a' ?
    view source
    ( S9 E2 f4 {" pprint?% y7 a  K5 O0 O- ]
    5 @, E0 U7 `; {' i( J
    1.function get_password( $length = 8 )
    . h" r* b: D) Y7 l) F2.{
    6 W5 c! D+ q2 c& o3 ]3.    $str = substr(md5(time()), 0, 6);
    8 w; \8 g0 g7 O# g# l+ A$ S4.    return $str;5 N7 J* `: ^& i! H/ f) k
    5.}7 ^9 |% G& d9 g3 Q6 k& q5 C

    0 O; w( \& J8 l0 Q4 j' M) w3 Y0 u5 {: C! q: D/ m( @
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。& p  ?. s( C- G/ Y
    view source
    0 l4 b  v, q* l1 v. H( Kprint?8 [4 b* d' C7 S1 R1 Z9 ~: f

    % L# w2 V- g* \7 V+ k9 ?2 m01.<?php( G& J/ ~* Y  P& W" C4 P
    02.function getmicrotime()0 {; `3 t% L: ~# J0 Y
    03.{
    / S8 P- I; c" i. e0 P04.    list($usec, $sec) = explode(" ",microtime());" {# p7 y) l' w" _
    05.    return ((float)$usec + (float)$sec);, F7 }% _+ Y$ K) D8 H" m: E5 X& X
    06.}
    0 r! y5 z) W8 O8 U07.
    ; P/ b: k6 r- ]! }# }08.// 记录开始时间
    % `0 O3 c6 d+ t09.$time_start = getmicrotime();
    " `8 y. P3 E) X. b9 K10. 4 D2 }. Y/ t# m/ s& t
    11.// 这里放要执行的PHP代码,如:
    6 O3 D* [/ a& T3 p/ H12.// echo create_password(6);2 o4 X3 a8 V+ s2 L
    13. ' r! t- T$ Y2 X; B0 c1 l
    14.// 记录结束时间' V  r9 j! K  {  e
    15.$time_end = getmicrotime();
    ( `2 ]+ |: F& @8 g" [3 h16.$time = $time_end - $time_start;' _& ~' R% H0 X& s
    17. 8 \; A: \4 e) p3 c
    18. // 输出运行总时间
    & J5 P8 _% A" \" [19.echo "执行时间 $time seconds";, g& S- W4 y8 u8 `0 G5 F( x
    20.?>+ Q7 z8 S$ ~* X+ I) k% R$ Z
    # e; l/ z1 ~5 i3 ~
    * f/ J. t/ T0 f
    最终得出的结果是:  [3 z2 S$ R# L0 w% ^$ @! c
    方法一:9.8943710327148E-5 秒
    & E" ~6 M3 {  f" B% G方法二:9.6797943115234E-5 秒2 I. ?1 y4 |/ C; d
    方法三:0.00017499923706055 秒
    6 O* N7 `0 J! e# Q% R3 H: u# C方法四:3.4093856811523E-5 秒' h& e8 v) S2 x6 ^7 X* _1 R: ]
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    - L' z6 t! H9 n' Z
    ) [* j4 X- `% L, A! T# m5 l, k2 G, z7 P* G* O
    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 14:20 , Processed in 0.400715 second(s), 52 queries .

    回顶部