QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2005|回复: 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,
    , q# _  B8 J- y) q- {0 Q" R2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    ; e; f) z0 w9 ?1 ?$ `, Y" m! [( v/ P3、重复以上 1、2 步骤 n 次,连接成 n 位的密码& y- j* Q% j* u' G6 U% q0 {. k
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
      G! ]9 J3 y; j' J' |. uview source7 X' p0 X8 t; K+ T  z$ F
    print?7 |0 i4 P6 w% e% y/ c5 p

      ]6 S. r* l: I01.function create_password($pw_length = 8)
    % o& R, C. X: J- f& H5 E6 @6 `02.{
    , J# `& g7 d$ I5 {) e4 |03.    $randpwd = '';" O& j: m; [0 O
    04.    for ($i = 0; $i < $pw_length; $i++) 1 Q% P8 _1 S* K0 Q  @9 a
    05.    {
    " V( o/ d  p3 [3 i8 c( p9 j06.        $randpwd .= chr(mt_rand(33, 126));1 C1 _! h$ Q" k  B' r( H5 H  `! u8 y
    07.    }
    / t$ e! I; f% k2 s9 D08.    return $randpwd;% @" n5 M7 F8 ~0 r# \
    09.}
    5 J/ d! q, W; R+ A3 i; S+ @10. ) g2 t. a6 a1 z) h8 J
    11.// 调用该函数,传递长度参数$pw_length = 6( u# A! V) f# d1 F+ ?, U: O/ S/ B6 h
    12.echo create_password(6);
    8 e: `& ?% H$ f( O; _) }1 p
    0 l2 x5 \- p* Z3 `# |9 J. O. g, y: P
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    " I( j; V9 k/ I3 n1 L2、在 $chars 字符串中随机取一个字符
    9 \) _6 R, j% H3、重复第二步 n 次,可得长度为 n 的密码9 a4 h9 A/ n; Q4 [' ~  \- M
    view source" S+ Z8 s0 t% f. {, u
    print?
    # y  G: i& A# D
    + j) S8 E1 G( E8 \2 u8 w01.function generate_password( $length = 8 ) {, E# M2 j: M% N, {7 R( T
    02.    // 密码字符集,可任意添加你需要的字符) ?; d7 D. n/ u
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    - c( M- B$ C: ]/ e8 ?5 E) S04.
    2 U, w7 V- W6 V" @% d: y- |9 b05.    $password = '';
    * A  U# u8 y% @06.    for ( $i = 0; $i < $length; $i++ )
    ; O# w# _. I  @. e07.    {
    * w: v  D" [6 {& p  W08.        // 这里提供两种字符获取方式) Q/ T+ c, a. {# c
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    4 x3 m+ ~8 g) B; x9 g10.        // 第二种是取字符数组 $chars 的任意元素# E3 c# P: \* J- I( M) y
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    $ ?- o% n/ E: f  ~. U7 t" Z$ X12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    ( n5 i2 X% \. J" a: e# j  Z13.    }
    9 ]: C9 p3 L- M$ {14.
    0 M- \( A! b1 o15.    return $password;
    ' ]  x. y( J$ [3 T16.}, x9 g6 c1 ?$ U5 p/ b

    9 J% Z* T; Y7 S% ?' S4 j' a+ g$ B2 a, P1 t! Y( e; M, ?& e
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    . [5 a# i$ G( B, }* Z2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    - h. X( a3 x! Q3 i2 M/ s, x' G3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    - r) B; q7 [' ?9 d! }# Lview source
    7 {( `  G/ T7 I1 \- Iprint?
    # O6 z# {+ _4 G0 L9 P3 ^
    0 r7 K5 q) l6 q4 L4 J1 \01.function make_password( $length = 8 )- }/ R6 ~6 G- j0 F' I
    02.{* g9 H8 X* }; {; |
    03.    // 密码字符集,可任意添加你需要的字符
    " y1 b3 i( R# E8 v5 b1 N& H  n) M04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    9 k) z  t9 l! f/ k4 F  l05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    + S2 S* g9 d2 g, P+ z/ X% Q06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 6 p8 G! d* K% I
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', $ [3 T6 i/ G1 P) q
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    ( ]: I2 W3 F; U% w* G. U( a6 L09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    % ~* K7 t+ g% ?) c9 J, ]$ I10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    # e2 ~. w* p; w11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', % {' k1 N2 I2 d$ Y# m% E  K3 b
    12.    '.', ';', ':', '/', '?', '|');
    6 `( I- ^3 A' h  e- P13.
    4 M9 h0 u3 x3 J' ~* z* N; |: r14.    // 在 $chars 中随机取 $length 个数组元素键名8 a, w$ F  g' \: ~( ~3 j* D  [
    15.    $keys = array_rand($chars, $length);
    $ u( {3 A) x9 Y: i16.
    & q/ t* s7 @/ D9 t& y17.    $password = '';
    # K6 f/ R$ [+ n8 N18.    for($i = 0; $i < $length; $i++)5 I3 f7 A# P( {3 t: {7 Q1 z6 s
    19.    {
      E0 y& y9 {7 J  C2 w, J20.        // 将 $length 个数组元素连接成字符串* d' L) ]' T6 m* X
    21.        $password .= $chars[$keys[$i]];
    . b* U" Y8 g& E22.    }! N; }1 z" p/ ^1 N0 x+ J; @' F
    23. - n8 ?1 b) a* \9 ~& x
    24.    return $password;3 x1 I; M4 |3 O* ?
    25.}
    ; c+ G2 T5 N! k& Q0 Z1 W+ G0 _" n/ J. m# p% [

    + M& n$ K( i0 ~1 m2 p4 q* Y1 {方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    , i% {  d$ M% ~5 X  {* Y1 ]1、time() 获取当前的 Unix 时间戳
    - O8 T+ T$ I2 a/ n/ \2、将第一步获取的时间戳进行 md5() 加密3 c" K3 k" ?* @9 A8 e
    3、将第二步加密的结果,截取 n 位即得想要的密码
    ' I8 q. Y  C* {& iview source1 W! h# m; l% h/ j3 o8 ]3 @
    print?
    2 i4 S1 j4 y0 V2 r# u5 |0 }
    : z% a9 `, G; y( P( f1.function get_password( $length = 8 )
    + c! G6 E8 Y; @: A& `3 V7 u2.{
    $ f* n6 X7 ~. k3.    $str = substr(md5(time()), 0, 6);  ^) |9 E: K5 b
    4.    return $str;$ A% b, Q' l0 F! \
    5.}
    2 B9 o4 J/ W% y4 ]/ o% |  n) H& u
    $ e) t, r  m; `8 @% X, E1 z' k" b; V; u6 ?% I" ?. T
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。; T. u8 Q% J( D0 H; ?. [
    view source" A) n, a1 V8 H
    print?8 D9 n& m1 w- k9 N* z

    4 h0 `2 B6 K! Q4 P- u01.<?php
    / S! V+ A$ r9 P% C02.function getmicrotime()
    5 u% v6 D0 o8 I" {# g" y! x$ g4 t, j03.{; U  m+ d3 T1 G9 v# B
    04.    list($usec, $sec) = explode(" ",microtime());
      R3 X* p9 W& ]/ o1 P; Y, i05.    return ((float)$usec + (float)$sec);+ ~; ^2 d. N6 w3 i, U! [
    06.}  i( O( c" u3 T
    07.   {2 P  s" }* s. O4 Y! g& u
    08.// 记录开始时间
    - s9 {3 Q% ~3 I1 ]2 {09.$time_start = getmicrotime();% S: o  T6 x9 f7 N$ X- w
    10. 7 Q% f; A7 {9 t4 g  p+ @
    11.// 这里放要执行的PHP代码,如:
    ; j' _7 g: [' l% e4 z12.// echo create_password(6);
    $ x) c, r7 g: K9 a5 z! p2 U13.
    , c9 H3 G$ y0 d: E14.// 记录结束时间
    ; }& s& f: H' v# |" P1 K) i* V5 {9 _15.$time_end = getmicrotime();
    4 @8 D. S0 M6 M) h* K4 z7 s16.$time = $time_end - $time_start;$ K6 Z" O! [) B, j
    17. ) e) O, [: h3 n0 |
    18. // 输出运行总时间 6 o0 j, u) n1 h' W2 J5 J$ y
    19.echo "执行时间 $time seconds";
    " |, E; \1 S8 ], v20.?>
    ; [" Y8 N/ ?6 s2 x# u! U8 G( P. \) x4 c# s  K$ M3 ~: U: N  v% |

    " e9 ^  Y4 a0 j最终得出的结果是:1 i4 E% ]3 l; x8 M, i7 X) s" w- B; ^
    方法一:9.8943710327148E-5 秒" k1 A, Q  c% r4 c/ {5 b6 D1 L
    方法二:9.6797943115234E-5 秒
    ' w  \! }# `9 m" T5 K8 i3 b方法三:0.00017499923706055 秒
    7 E1 K. I! V9 n: d1 H+ X3 T方法四:3.4093856811523E-5 秒8 S( I% b+ o2 ]* W# b# n5 s4 |. N( i
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    8 v: ]) U0 W7 `( M" O7 E
    - X; u0 n' }7 ^9 t4 i: t
    - G8 ]. E& ^  I, y4 x
    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-16 05:11 , Processed in 0.402698 second(s), 53 queries .

    回顶部