QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2327|回复: 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,+ t; J- B! T4 U7 O# f3 K; h
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #3 K1 u0 P" k4 H* U+ x" L
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    & j8 r$ R1 G9 j" y/ K( ^! N( [% l该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    6 Y7 Y2 g! Q9 V8 @% o/ m- lview source
    3 b2 l* s6 i) r8 d9 q' w5 Iprint?' c) M, t3 V+ F

    + j! _0 M, g" G01.function create_password($pw_length = 8)7 ~% x) \2 _& u; {3 L$ T
    02.{
      ^1 q' U: n2 r0 H( F) }03.    $randpwd = '';/ S* R" K: a( X1 j) ?
    04.    for ($i = 0; $i < $pw_length; $i++)
    ; ^1 [5 I2 j' u05.    {
      }& Z7 b  ^) U) S' P7 \' m06.        $randpwd .= chr(mt_rand(33, 126));
    * N& s2 o: A3 A( o07.    }
    ( A" u- V! i0 M6 g0 E- c) H" K08.    return $randpwd;
    & G$ y& @# f" y* p8 K09.}* _- e8 p0 {% I
    10. 0 x/ B5 v+ ~0 R5 n! e) u1 r9 Z
    11.// 调用该函数,传递长度参数$pw_length = 6
    5 a2 g' g6 m5 u* D' }' W0 ^12.echo create_password(6);& V/ {) Z( E1 A5 u( r8 _+ I

    ' w* g: W  b( [) [; @% p
    : |# U6 J; v" h; G) R方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    3 T& [, n+ r5 G# Y( J" u2、在 $chars 字符串中随机取一个字符
    5 `. S: c) \- H3、重复第二步 n 次,可得长度为 n 的密码' `3 L' ^8 v5 J3 H. M# n! u9 r
    view source
    + T( Y) o5 `+ t% sprint?+ \" U6 ~' I# @; L  g+ W: P! W

    ' Q5 R  r3 l+ _; d7 z) y01.function generate_password( $length = 8 ) {
    " v! [) ^  a& m02.    // 密码字符集,可任意添加你需要的字符
    9 Z+ e& E# [3 v9 Y! J3 |3 Y03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';4 i) v# R/ ~& \5 X; o
    04. 6 u  L6 u" O8 d6 @- l1 U" X( a6 O
    05.    $password = '';
    : e) {, e+ U# l1 @/ Y2 W7 P  J4 g" L06.    for ( $i = 0; $i < $length; $i++ ) 7 s' K6 V* Y  L2 c$ B
    07.    {, [' w9 F( Y8 p( t+ e9 z1 m
    08.        // 这里提供两种字符获取方式. C) H) Q4 H. D! t- @6 Z
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    : K: T/ |. w: T( Q2 ^+ u10.        // 第二种是取字符数组 $chars 的任意元素, b4 v1 F/ e" s' U  a0 F+ l
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    # p/ v( c7 i# U) z" |12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];3 [* Q/ p; {6 f. b5 d/ h
    13.    }/ Q3 Y) v6 X1 @. X: U" v
    14. 9 y2 W! |# _4 d) C
    15.    return $password;1 V+ w) i( T# \* @! N9 O
    16.}
    ) y+ S, R% z" r. n% h
      j- C3 b& d4 c( q* x- D
    " m* m. v. _7 s& m$ J方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符. _4 }% P2 g1 u0 P8 Y+ m( F
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    $ Z# \9 H0 m- i7 {& K/ R3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。3 h2 t; D2 V3 D" g9 C
    view source: u: u/ P" o7 E- I
    print?' |, R+ M% ~( _) {# W! c; u" q
      }# K, r. o0 m, \- f
    01.function make_password( $length = 8 )
    / J: K( I3 P5 Q, y! t& ~) G02.{
    ; Z3 \) q) ^2 d+ r, H03.    // 密码字符集,可任意添加你需要的字符
    7 O3 D3 V$ I8 W- N5 W# N04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', ; d: F$ b/ ], D0 ^3 \/ G, D( n$ x
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', . s, \0 R; K4 p4 J- v
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', ( }( N3 n% }2 d, L5 T& X6 [8 i. I
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    ; a  v* e- {9 S. j) G3 W5 N08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    & y$ d6 U' D2 }2 }. f- E5 d. U; ]* T09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    4 _5 A* f1 n3 X, u7 ?* Q$ L10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    3 O* k" j2 N8 \6 e9 M. Z$ \11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    3 C- p5 ^9 ]# y& Q) y& L12.    '.', ';', ':', '/', '?', '|');* P  q0 b% w- P$ e4 E2 ]5 r) v
    13. , n. i1 o+ I) h  k
    14.    // 在 $chars 中随机取 $length 个数组元素键名- Y/ ]6 |& a# G! j  B$ u
    15.    $keys = array_rand($chars, $length);
    ! q* u$ z1 _$ n- }2 H  g4 ^& t16.
    " V+ n$ U: j8 @6 d" p6 R17.    $password = '';
    0 S5 ]) N7 }; y) }" y( p18.    for($i = 0; $i < $length; $i++)
    , a! W) Y: M4 F9 |- B9 v0 ?19.    {
    ; b: Z. F( ~9 s( y20.        // 将 $length 个数组元素连接成字符串8 s$ [4 g! S5 V" P! I
    21.        $password .= $chars[$keys[$i]];; x+ B% K. o' j! `9 e
    22.    }
    ) }  X6 a: |$ y9 y% }23. + H! s# N+ O3 |; T! T2 u0 t$ H/ B
    24.    return $password;; G$ a9 N7 `1 w5 \
    25.}
    1 H0 G' P7 G* A2 E0 v  n! B, q; F4 J4 O# q8 S2 x5 G" M

    8 U+ p, r4 I  Q0 N- a方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    - f6 D( f9 E0 S# Y! g( |8 C) s3 D1、time() 获取当前的 Unix 时间戳3 R& y$ b4 v# {0 m7 N
    2、将第一步获取的时间戳进行 md5() 加密
    ; A' d  X& `. B% ]3、将第二步加密的结果,截取 n 位即得想要的密码
    * f8 X1 M, `% o; K: s5 Pview source0 t* m7 U/ I. S8 P
    print?
    0 e  E' Y1 X+ X+ m& \+ I# A+ |% E( n+ D
    1.function get_password( $length = 8 ) 4 h& z7 l: M: e& k4 }
    2.{
    ; f' r- u. t3 j& v' i3.    $str = substr(md5(time()), 0, 6);
    & I& R9 z  ?1 A$ v: m4.    return $str;- F$ O% v, p! A% k0 t6 N4 |! e5 K
    5.}- D9 g7 a  X) P) r8 K
    2 Y0 {0 o) s7 \8 K7 W6 E; V" @) K% G
    . [- Q/ U/ o/ f2 s
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    9 D, b4 i; ?; P6 Z% Nview source" v% p: Y8 ^/ v9 h/ ^$ f
    print?
    0 u# k- ~# j1 Q5 S
    1 N* h( ?2 l$ O" E3 q6 l" x; {01.<?php
    & Z) ?1 w* F% ]02.function getmicrotime()
    3 d( w- V- B' q+ e4 h* ?03.{
    & {, t0 |) @" o3 c  T! c0 I) H. Y04.    list($usec, $sec) = explode(" ",microtime());
    ) ?3 d, n, ^9 @- _( |! n3 e05.    return ((float)$usec + (float)$sec);
    . S/ C- G: Y5 V% i0 j: g2 f06.}
    ' e( ^: Y0 r7 U  ^07. / V# w$ \+ ~5 S, f
    08.// 记录开始时间
      y9 a3 C$ m) ~1 x& d09.$time_start = getmicrotime();
    2 p/ j% X  Y$ ]) X10. ) ?! M% _. i2 @
    11.// 这里放要执行的PHP代码,如:
    3 R, F6 L) C9 v0 A$ ~8 ?1 _0 V% j12.// echo create_password(6);% `% o4 B( ^/ T- ^7 @
    13. 0 W! N7 j  n+ ^' [
    14.// 记录结束时间1 U; h* D/ N* \8 [; m
    15.$time_end = getmicrotime();/ r' R$ t( |. N1 `" ^; c) b
    16.$time = $time_end - $time_start;, P% f" {% l3 x) W
    17. . Q2 p, T$ Y0 k
    18. // 输出运行总时间 * r' v% v( C, f0 U( p' B+ B
    19.echo "执行时间 $time seconds";
      e5 g  K- j* _4 ^  Z& ]$ C; j20.?>
    * R2 ]! b% I" G3 `
    7 r  v' [& r- g& |0 P8 i
    1 ^  ^" }* G% ~7 z  p8 H, `8 l2 J0 y- G最终得出的结果是:
    ( \* K8 p9 b5 m4 x- b方法一:9.8943710327148E-5 秒
    / ~# g4 J  ~% X; E  K9 ^方法二:9.6797943115234E-5 秒1 M3 R( m7 D& F' V  A) z
    方法三:0.00017499923706055 秒0 N/ k5 {' c) R
    方法四:3.4093856811523E-5 秒
    # U6 N4 \. e2 N* ~$ _6 ]# b1 e可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。1 A' v" g, s" W0 N- Y4 g
    $ l$ o7 M7 z1 K* u' a4 c$ R

    $ W4 O7 c. C; N
    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-7-13 14:21 , Processed in 0.890597 second(s), 52 queries .

    回顶部