QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2015|回复: 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,+ k2 l9 J3 b7 L# b4 z4 R! X
    2、将 35 转换成对应的ASCII码字符,如 35 对应 ## I4 e! C3 F* z
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码. i4 |+ T; _+ q) p, O' i
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    ; B2 F+ r6 [( d: G) T$ ^; v. c7 m1 @' Pview source; A% l1 t* P0 f  V5 U$ B7 M
    print?  e4 [3 c, b$ _* G* ]2 ]
    ; j6 R) \9 N, q3 h8 @, w
    01.function create_password($pw_length = 8)
    7 O. b& d" x0 ]- ~) [: j* u9 t02.{* {0 _; u' w) Y* T
    03.    $randpwd = '';! g% o/ L- M' {9 Y
    04.    for ($i = 0; $i < $pw_length; $i++) . B. n# Z3 Y0 ^+ S0 |1 y& \& Q2 o, S
    05.    {) W( c* U' }5 h% `. s
    06.        $randpwd .= chr(mt_rand(33, 126));
    . O/ O( v$ D* q+ p0 g07.    }
    $ w, v( W% s2 ~08.    return $randpwd;; Y& n% p# C4 o; H1 S9 K. E7 E
    09.}% S' G  @# D/ ]$ D/ l. n! i3 V2 @
    10.
    . o8 D1 ^5 ^0 @11.// 调用该函数,传递长度参数$pw_length = 6
    5 A+ y  Z$ Y' K; j7 n1 v) B12.echo create_password(6);
    ! U. x) @- n' I" F- }% R7 _  [- S7 v: g5 i* a
    . M8 P& c% l/ ^; b2 S( n" H
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符9 w( A8 N* @4 d* F0 f( t$ k5 \
    2、在 $chars 字符串中随机取一个字符
    ' k6 |1 ]4 q8 F8 f) S2 b% q3、重复第二步 n 次,可得长度为 n 的密码0 y8 j( f8 R- ~* X
    view source
    " \9 h/ e9 a3 I3 aprint?; f3 h( m1 e) H$ s3 l
      E* |8 `& p" G$ l0 I5 p0 G
    01.function generate_password( $length = 8 ) {5 n0 p- n7 h! s# `, j
    02.    // 密码字符集,可任意添加你需要的字符! u# d% ^* k4 G3 l7 s: L6 L# o
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';+ U+ Q' ^9 A8 ~) C
    04.
    * ~5 q* j6 P: E2 s! |05.    $password = '';
      P& X5 ?5 \2 d, Z06.    for ( $i = 0; $i < $length; $i++ )
    ) S! D4 o9 Q% k6 o7 l5 H07.    {
    / c( E8 K  t. r1 _  s08.        // 这里提供两种字符获取方式
    0 @. l- l2 C" S9 R% }09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    * l. y7 f6 z  E( y( P10.        // 第二种是取字符数组 $chars 的任意元素
    + `0 v3 J2 c, ~, v) ~11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    1 c9 E3 W" s" I$ Z, ^  J12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
      [1 _8 l* R5 j! A0 n13.    }  k+ Z7 ]$ b" u6 a" A. P
    14.
      `% u! p8 c' \* }! G15.    return $password;! g6 R. ]4 D- u! r6 j
    16.}5 l4 @, R5 A$ R9 Z% b( b1 E

    " m1 B& P/ Y2 Q% b0 K4 R. G( E5 y& e% G9 M4 q7 ^! s) F9 q/ o4 ^
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    9 c* I' d- j8 W  m( R2、通过array_rand()从数组 $chars 中随机选出 $length 个元素( h" x1 E: v: y- i$ n, ]0 R5 r
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    * n3 ?/ b& J: z! b0 E9 ^view source8 b& h3 c5 s5 V. X, T
    print?) F9 t" H2 ?/ H5 ^

    " B  s0 ?4 J! J4 Z/ _01.function make_password( $length = 8 )' P8 H) d0 a( i& H8 ^0 Z
    02.{
    $ l3 J& u) ^6 L1 c0 D- Z03.    // 密码字符集,可任意添加你需要的字符
    " V/ ]- I8 q7 ]1 L) J04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 3 g3 z7 D: ^, s6 H# I. J1 ~
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', ; O4 n) B2 C6 O' j  L8 W. f
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', & @2 Y/ E7 i: R7 b  ]
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', + _  w& X9 e+ f2 y  y
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    5 F* g" ?; g9 z3 I09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    " d9 B) w  V5 M8 v10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    9 P! v/ g% V- m& O' a# O! @; i' o11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', ( m% U7 ~4 d* t2 O/ f
    12.    '.', ';', ':', '/', '?', '|');
    ; f7 R9 B! v; H5 J: R( T13. 8 M4 H( M, X# m( g
    14.    // 在 $chars 中随机取 $length 个数组元素键名2 o3 b$ J5 m5 E6 \
    15.    $keys = array_rand($chars, $length); 7 f6 |2 o( Z9 W- d: {
    16.   `# [: q: z* v& g5 K5 M2 q( J$ }+ G1 y
    17.    $password = '';
    0 e, ]" }% t5 q" n! ~18.    for($i = 0; $i < $length; $i++)
    9 ]6 [, g- P1 P9 i7 ?& n  |2 D19.    {: g6 A+ s; j: ]. F
    20.        // 将 $length 个数组元素连接成字符串! v4 i$ }' F" d! j/ z
    21.        $password .= $chars[$keys[$i]];& j8 x% v) l% I& v
    22.    }9 m, l4 k% {2 h
    23.
    ) B; u6 U2 V1 t* r4 l24.    return $password;
    5 |3 @+ M* j$ Z25.}6 y+ V! \6 `9 T: Z

    8 Y! w" [2 J/ _9 r! ^. M7 [
    $ b0 ~+ |( _% Y6 C9 h方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    . ~8 p& H! b; g' g$ ?8 X1、time() 获取当前的 Unix 时间戳, `7 `0 U9 \+ l2 f1 U& v
    2、将第一步获取的时间戳进行 md5() 加密
    9 W1 q% n( A! j  O; G9 H3、将第二步加密的结果,截取 n 位即得想要的密码
    1 ]% {/ @) Z' |2 Fview source
    3 m( u: h5 O) \4 pprint?
    9 J0 m+ n& x# E6 c  o1 X1 q: f$ Z1 @! b$ F' i. X! @. \
    1.function get_password( $length = 8 )
      A! A3 Z& Q- h9 P; d8 s2.{
    ) Z3 h/ |9 O, |1 W2 Z0 K3.    $str = substr(md5(time()), 0, 6);
    5 ^1 O# M5 M, _4.    return $str;
    9 A, y5 W( W& }9 O2 q5.}& E0 `$ _  v: Y
    3 P. H% l; R% W: i
    ( Q  P" z. X1 X  s' n
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。9 t2 ~" k. }! h6 v9 V
    view source: G' l8 ~* h/ Z, R
    print?4 R' \7 w) D3 R4 e
    + E# c* J; J+ R
    01.<?php) p  E4 F, `4 C% @5 \! Y/ Y& G" V
    02.function getmicrotime()
    5 G& A$ O1 w9 g, g. @  _03.{
    ) k8 O4 [- Q& i+ l4 m04.    list($usec, $sec) = explode(" ",microtime());
    ) G& L; g( K/ _8 t) H. g* W) @05.    return ((float)$usec + (float)$sec);
    % r. C0 D; t- \+ G  Q06.}3 m. z, l( H3 z* B" q2 T0 b
    07.
    # X" U5 {' n* Z# z' `/ U08.// 记录开始时间( u3 s' p5 h" i& U' Z; j% M$ T, q/ Y
    09.$time_start = getmicrotime();
    6 ?' U4 V3 p6 s, z5 v, ?: n10. / T% s2 d' ^$ @2 N) l5 h
    11.// 这里放要执行的PHP代码,如:
    ) [+ m2 D9 _0 B6 w12.// echo create_password(6);% t7 V: A" }% K# s% c
    13. ) I# c. Z! R3 i& d
    14.// 记录结束时间5 M/ f& c& A$ H& z- }
    15.$time_end = getmicrotime();8 e3 a2 `: a+ l: B/ y' E7 X. o
    16.$time = $time_end - $time_start;2 b6 d/ j" o7 K2 i- O  |- C
    17.
    1 g7 r: ~# j9 t& r18. // 输出运行总时间 4 ]8 V( w. t" m4 g  b6 V" R
    19.echo "执行时间 $time seconds";
    , M& r: a1 Z  `5 F+ Z" Y20.?>
    " j6 [' y- H) w/ ~: ^4 `5 @
    9 y; B2 _1 n4 c; n# A/ P9 f  p( C' x
    最终得出的结果是:. T. g" o$ ?1 z& I8 i* O& D  b
    方法一:9.8943710327148E-5 秒; U6 E9 E8 R+ h* F+ v* o
    方法二:9.6797943115234E-5 秒& H& m/ ^# D- ~: X% e+ s' g
    方法三:0.00017499923706055 秒
    ! L6 U" P0 F2 c方法四:3.4093856811523E-5 秒
    / @' O: Q) I4 h! H9 G可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。+ l' O: T0 `3 y
    . Q7 [3 G1 x5 c

    5 l& p  }& ?+ J. |
    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, 2025-8-18 19:26 , Processed in 0.419347 second(s), 53 queries .

    回顶部