QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2312|回复: 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,
    + b2 P0 _: T6 Y. t6 Q2、将 35 转换成对应的ASCII码字符,如 35 对应 #. I2 }& C/ `0 Z: I4 A8 @, ]
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码* j( g) m; T- V, {* S
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    * H% z! p9 n1 o, a4 P6 j  ]view source
    3 f% K4 E% D, L8 _6 }+ w# Q4 iprint?+ y$ `* V' Q4 z3 a  _( p

    4 t5 ?; a2 L4 R01.function create_password($pw_length = 8), X. p) R' q9 T$ o# V+ S: ?
    02.{
    , ]; j& m9 e; U03.    $randpwd = '';; M% y# x6 F/ A$ H% ^  A) t
    04.    for ($i = 0; $i < $pw_length; $i++) 7 z6 Q$ A5 R( Q) k+ I* D; @+ g/ F
    05.    {
    $ C9 m; c* H; r! W06.        $randpwd .= chr(mt_rand(33, 126));" w+ l/ A8 G! W. r" e0 u2 W
    07.    }
    ( y8 W, _1 U+ s+ H08.    return $randpwd;/ C! {8 p- q) i2 Q- J3 M% C
    09.}
    $ c) g  r0 |& O% Y8 F10.
    # W6 {5 v  Y1 m2 x. I# i4 n* N5 ]0 h* K: U11.// 调用该函数,传递长度参数$pw_length = 6
    8 h" I4 H8 R' p$ S' q$ p12.echo create_password(6);
    1 F/ h& D1 @* v. D1 f, P  {/ d% s8 u3 M- Q3 k) Y2 N
    & M# F4 P4 E) A0 G1 E; J
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符9 _8 u, T* @6 D% L& y4 ]2 D  B
    2、在 $chars 字符串中随机取一个字符
    1 I0 H, O) s) n6 t; j. Q2 L3、重复第二步 n 次,可得长度为 n 的密码2 a) Y& b7 `8 h% z0 o5 X
    view source
    4 e  p' A& f& V( H1 Y9 k7 Mprint?
    . x0 }7 X+ A8 W
    - e4 x" n5 ^# D+ Z01.function generate_password( $length = 8 ) {
    9 }7 Q* ?/ p  {02.    // 密码字符集,可任意添加你需要的字符
    + s7 K: [  X$ m+ u' f, Q03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    1 U: F4 `, h9 z4 I& M) R+ v04. * V5 [0 [9 q% O
    05.    $password = '';
    / ?" h* s# }- y. p- v/ A06.    for ( $i = 0; $i < $length; $i++ ) 0 F* X* l, G6 F/ D- l
    07.    {
    * Z& b8 O5 m7 i- y- }08.        // 这里提供两种字符获取方式* S( ~1 Q' R, i$ P5 n: O/ I4 A6 N  n
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    5 {$ @; T* i+ m0 u$ I1 }1 O: m10.        // 第二种是取字符数组 $chars 的任意元素
    $ p! U: v% L$ O7 D5 @11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);# R- A. p. \6 }( j* U9 _
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    $ v) e, Y: P: c9 G' @7 f$ t" ?13.    }2 {4 m: s2 m) L" ~7 h8 N
    14. 4 w+ `8 D2 r: l5 g$ r8 _# w
    15.    return $password;
    ' Q2 U9 M6 _" [- y( d16.}  P2 `7 M2 ~# }2 ]  @* O; \& ?

    3 x4 ^( J& k1 k6 w$ m' U5 u" E/ W
    2 d8 R3 _# e( o4 X* S方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符5 h2 J4 P. ]  j/ w( D. D2 X
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素% p/ P8 R2 _9 a8 R
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    ) f- ^* _' ?  h5 t" P9 o( Vview source* V! a9 P0 |/ b4 d: P9 L; `
    print?
    8 v! e1 c5 s, k" t1 V/ k& c3 i' D4 A" T
    01.function make_password( $length = 8 )
    : D1 U8 k/ S3 h6 x$ V+ r' }02.{
    " k7 j$ ^7 D% F7 f) z03.    // 密码字符集,可任意添加你需要的字符
    4 [8 y! x' _$ H/ a" V6 Y+ `04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', - o. [9 `5 b5 T
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',   `. m! V: O( U. t  j' P  Q
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    + S+ `- `; Y, x# T/ S- C0 J1 e# ^07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    & d5 |. f) f+ R7 j08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', / e* s( h, Q, K/ \9 @4 a
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', , ^+ j6 e' {0 I) ?1 N3 r
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',   s8 X) A9 x$ G. o5 b& Z
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 3 S: N; R. `; C& ?9 Z* C% T6 S
    12.    '.', ';', ':', '/', '?', '|');
    8 }: n9 Q, ^3 Z4 J4 Y13.
    + O# b# |: M  |: h4 ]3 J14.    // 在 $chars 中随机取 $length 个数组元素键名
    . l8 l" ~* I' Z' l5 T15.    $keys = array_rand($chars, $length); ( E! w  `& v7 |! a( E( n
    16.
    1 ^0 W! e. [9 R& u5 w2 ?17.    $password = '';% \' ^+ y/ I7 C7 i
    18.    for($i = 0; $i < $length; $i++)
    2 G, Q9 E! J/ V19.    {
    , c; c) @$ i1 T# j  y5 W7 T# w" m20.        // 将 $length 个数组元素连接成字符串; `$ U8 O4 S9 E4 p4 y2 W
    21.        $password .= $chars[$keys[$i]];" m$ Y; W6 j( z* h
    22.    }! _# J: T6 @' _, [! x7 g& h
    23. 2 I3 D2 @$ w, i) T: r' v8 u6 K
    24.    return $password;
    5 \  {! H4 m3 j0 S6 }& {25.}
    * e+ C" @$ f/ w" \( @% m- E/ p' T5 w6 I+ f) `! S! |; p! a6 }

    * Y1 _6 b/ \  V5 T0 P0 F% y1 k方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    7 G% |7 u' V! z9 x7 g, w) t5 l1 l) M1、time() 获取当前的 Unix 时间戳! w+ Y$ s: A3 ]& x( S' {
    2、将第一步获取的时间戳进行 md5() 加密
    1 W; f& a* r4 Z! B. V6 d7 P3、将第二步加密的结果,截取 n 位即得想要的密码
    1 d5 z( M! c" f2 kview source6 X/ ]) W8 t' R
    print?3 V0 O  `% h1 k, _; M+ |8 F) _

    / V% X, s* g6 y* t1.function get_password( $length = 8 )
    : O, d8 o9 w' O( }, Z) h* d& U2.{
    * X, \( {8 j6 t* V# r- ]/ E4 r( |3.    $str = substr(md5(time()), 0, 6);; [/ R8 E, R" C& M4 s
    4.    return $str;
    $ N$ i; K) P1 P3 s" a) {# r. v/ k5.}
    + d* b! f5 I2 B
    8 |( H* j6 k$ V5 m/ k& Q& G3 q! @& b5 X& s" z4 B6 \# y2 D
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    6 ]/ R! E/ m4 |* ]2 H6 Jview source( C( k. ^+ q4 \1 T
    print?( I$ U! m& D9 u& r+ y

    2 r, z7 C: r6 _. j1 ?, J0 d01.<?php) I2 W+ }1 Q0 p6 X% x
    02.function getmicrotime(); S0 w; r7 a! N5 G" Y
    03.{
    " m& k5 Z* |  p: F8 _" Z9 m. [04.    list($usec, $sec) = explode(" ",microtime());; e& C( l+ D$ V" d' q- Y
    05.    return ((float)$usec + (float)$sec);1 f8 g# ]9 }, u& ]1 m0 n0 y8 m
    06.}
    9 @2 Z. r# @" e9 Q* j07. 0 M& u0 j/ {" C2 e- ?8 J9 m6 d
    08.// 记录开始时间0 ]' U. V# c& ?1 t( m- ]
    09.$time_start = getmicrotime();! b% [  z4 U: h# c) b/ k1 `- ]
    10.
    7 j0 P; M3 v8 @* L4 k: |2 b. ~11.// 这里放要执行的PHP代码,如:
    ! V! H$ j+ ^  \12.// echo create_password(6);
    : B& b1 f+ J  G, O8 o2 M13. * N0 \/ m0 U# E# E6 t
    14.// 记录结束时间
    3 w2 n5 v: a  R1 G$ K3 L/ e15.$time_end = getmicrotime();2 m7 E5 ~* r) U' s) f3 T
    16.$time = $time_end - $time_start;
    # ^; I" z# |9 Q4 [) `3 p% q1 P* p17.
    $ Q0 ]5 o0 N$ n& ]! n/ X. Z1 v$ i18. // 输出运行总时间
    9 O+ q" z2 K. S1 [; K( V19.echo "执行时间 $time seconds";& v" H& K0 x( T* k3 A4 E& ~* Z
    20.?>& ^- Y8 ]+ e, \
    ! d* S+ ?& r$ l$ f- x

    # X- |' G. V4 {$ `最终得出的结果是:
    ) j- N- ]" L( r5 b) q9 z方法一:9.8943710327148E-5 秒& {0 h6 W6 T1 F( }' c) }
    方法二:9.6797943115234E-5 秒
    , v! w  S# w/ k1 {% L. C方法三:0.00017499923706055 秒: x  j3 K5 K/ m- N5 i' I
    方法四:3.4093856811523E-5 秒
    2 D/ v# h# r( k: {$ F& T可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。6 G4 ]: Z% o  j

    * r5 m8 F$ ?6 {; l: g% }5 x9 g0 m$ y1 n6 S  w( k
    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-6-16 13:54 , Processed in 0.448192 second(s), 56 queries .

    回顶部