QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2434|回复: 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,
    3 A& L$ ]6 b+ g8 \2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    - p2 u" U* ]1 r( s2 U3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    ' A' b. R" a1 q3 d该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表; chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    8 ^$ ], L3 o1 i' B" Eview source
    $ I/ x: \. c: N6 ~# s/ B! a+ Cprint?
    5 j. R( {; W7 U
    , B* v- b+ T7 N# ^* M01.function create_password($pw_length = 8)5 w+ _* c% H2 N! Y  N9 z
    02.{5 r6 E5 ]# @* b9 w9 g
    03.    $randpwd = '';
    * U2 I/ s% O* m7 q5 G. C7 z04.    for ($i = 0; $i < $pw_length; $i++) ! i' @! Y9 ~! {, l4 \. j
    05.    {! C! H6 h0 x4 L
    06.        $randpwd .= chr(mt_rand(33, 126));+ Y/ C5 @" o& P( D
    07.    }
    0 W# J7 e7 W  l& [6 a& }* b08.    return $randpwd;
    : `6 Q) R3 u& ~6 G) r+ G" |7 Z09.}! m1 m* ?4 s0 y: p; }/ u
    10. " L( v+ N5 p/ Y( a- r
    11.// 调用该函数,传递长度参数$pw_length = 6' B/ S3 N0 |$ L( q# [" Y
    12.echo create_password(6);, z  Y8 @% c4 o' z% y9 V
    : b" ^5 C  k$ r( z6 Z% d
    / j. h8 u& H2 Y: `+ |2 x  y
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    , k* {) J( n2 D9 V+ G/ t$ N* i: Y2、在 $chars 字符串中随机取一个字符
    5 E" T. m/ Q  h% \5 G0 W0 l3、重复第二步 n 次,可得长度为 n 的密码
    & A, M, n& r% a  oview source
    4 b% F6 b) I$ q% Jprint?
    - I  [0 N! @2 }" |% s- U  r  q0 d( Y+ v4 g- D9 f% F0 \
    01.function generate_password( $length = 8 ) {" J/ U; q" `$ d, v$ q+ ]8 L
    02.    // 密码字符集,可任意添加你需要的字符
    2 G  ]& E6 R8 h3 {4 w03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    8 J' }5 e( r$ j( P6 g2 D04.
    + [; {4 P" a- g* o3 ~05.    $password = '';
    2 v% t, R; Q% H) y/ j$ B06.    for ( $i = 0; $i < $length; $i++ ) 8 D2 O# ^$ b# d( U
    07.    {
    1 r, G) D" z. U" x08.        // 这里提供两种字符获取方式
    1 `' j$ P. B3 K$ v7 A4 q1 H09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    ) R% m! O- L9 H4 E6 |0 c7 {+ F10.        // 第二种是取字符数组 $chars 的任意元素) [3 l% P3 y0 g* U' Q
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    + n5 E1 {9 X! I12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    , K/ b5 R  D4 x13.    }
    3 J# c4 K/ p2 |5 ^& f$ Z: `5 v14.
    : B9 k3 h3 v' R) ~( R+ |' z% X* @15.    return $password;# r) p9 Q+ m+ k
    16.}
    $ G9 _* c6 Z% w0 u% N( Q$ Y+ ?$ z2 t: q* Q& H" i5 K: Y: q

    ' e& {3 O, s! l1 ~- m# G, _方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    ! I4 i4 y, W0 d5 ~! Q% f2、通过array_rand()从数组 $chars 中随机选出 $length 个元素8 Y2 X( k+ A) @
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    3 n+ `: \! S  L6 G8 ?3 H( bview source9 e2 e( h$ w& ?# i' ?
    print?
    9 d& L, v8 V9 \/ ?/ `" q
    # ~) L$ V* o+ \2 P01.function make_password( $length = 8 )
    3 U, W" a3 \. l$ D) k1 g8 t) p02.{0 N8 o( p& q) g, i2 \/ h$ p
    03.    // 密码字符集,可任意添加你需要的字符
    0 S2 O* p8 v( @! i; E- j04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    % |; L6 y1 W% o9 }" g2 X6 z3 t05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    # l4 m  t0 ~% @( i1 }: t- R# F% g06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    # q/ |: d& n( A07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    7 S4 |: v- S( A0 |9 N: g08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', & u0 o! `5 r. i9 L' y
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', + @  x7 O$ ^! X$ h* z" `
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    7 y, @' N% i# q4 }2 z, c5 d11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', # {; Y6 R) n+ ?
    12.    '.', ';', ':', '/', '?', '|');
    % v) F$ M$ V! [2 `8 Q9 I13.
    + B0 C  Z1 V$ o" P4 I4 B14.    // 在 $chars 中随机取 $length 个数组元素键名
    9 {$ C* o" d3 E# Y8 c" ?' o. P* _15.    $keys = array_rand($chars, $length); 9 Q0 q& P* y  o
    16. 6 ~+ _! B/ b7 x( T1 r5 y0 y
    17.    $password = '';3 v5 m( ~# J, X* l
    18.    for($i = 0; $i < $length; $i++)! Q8 K1 L3 i2 N- ^- }6 U
    19.    {
    * n" [# r7 Q& {8 l' o4 I* m20.        // 将 $length 个数组元素连接成字符串
    ( T7 j+ ~. W9 f  H/ H21.        $password .= $chars[$keys[$i]];
    , a  K4 D% _) Q4 C; [% N22.    }
    7 q* Y* c% a% \; k" @23.
    8 }$ D; V' ]: O' l/ B8 z: Q24.    return $password;
    2 R. f. u& l4 a1 w0 D' `25.}
      {5 n) d8 B+ X4 u: d
    # z( J, }( d* X! \* p  w
    - m% e; f9 y: g! ~2 O+ {1 E& T) O方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:4 d& j" M( c% s  P) Y
    1、time() 获取当前的 Unix 时间戳. U4 m  U7 y0 {1 F
    2、将第一步获取的时间戳进行 md5() 加密, \2 H3 d9 Y9 c  A+ L" V( j( Z# Y
    3、将第二步加密的结果,截取 n 位即得想要的密码
    5 t4 n; X* m, n+ F6 u' Kview source
    0 u6 u( [9 `3 i" w. ]print?
    0 c: {" h7 r9 T9 o% h+ r
    ; i6 [2 Y: u0 K4 N; s1.function get_password( $length = 8 ) - S1 k8 }7 m2 f0 ?2 ~8 V4 F( \
    2.{1 K# N" N" K3 J3 p% p7 d- ~
    3.    $str = substr(md5(time()), 0, 6);
    , o( l$ ~+ R% @2 [7 ?! @4.    return $str;1 P$ l: k; x# e' I, [
    5.}+ `, s, r0 \/ a

    8 r8 X7 n* B* Y& B' f+ G- R/ _6 E- H- z! s3 R& ?
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。+ @  H5 }: Y; f5 ~# |& F
    view source
    " v/ f) A- e" Qprint?
    / ~! Y( i3 q; ~$ i' D! p' \. R" R
    2 Y' z" Y2 T; g* z01.<?php( v2 ^! B, K1 L
    02.function getmicrotime()
    & @  U6 I0 e  c' J/ r03.{- v4 T  g6 m8 @: B# S8 l
    04.    list($usec, $sec) = explode(" ",microtime());9 {- Q+ `; e  N/ D8 i
    05.    return ((float)$usec + (float)$sec);
    $ i; M. h5 r$ D$ i& b% j/ J# }$ x06.}% F; p1 r! X" E
    07.
    . H( O' j, b- o" ]08.// 记录开始时间
    4 B+ _# X: \# H# w: ~' c09.$time_start = getmicrotime();, B  z( ?5 ^) `' L3 k8 Q
    10. 2 i4 M! u3 {( H- j) g, h' b
    11.// 这里放要执行的PHP代码,如:
    1 e$ `( E( D3 B0 Y. R5 f) R$ u12.// echo create_password(6);
    0 K6 @& }5 T" M$ Q9 o- N13. % v0 F4 z2 E7 s
    14.// 记录结束时间
    $ F$ ?% P) d4 l) t, }* @+ C15.$time_end = getmicrotime();% W$ P0 O6 M$ k; e
    16.$time = $time_end - $time_start;! j: p0 w5 S: Q) Y( W
    17. + ?) C0 o0 F. z
    18. // 输出运行总时间 5 m5 a3 m( s. b" S/ S9 M' ]# g2 G
    19.echo "执行时间 $time seconds";
    . U1 H; W& x1 X" l20.?>. v. z" x% e) E4 j; l; Q+ f0 `7 X
    6 T! k. t8 I; u" ^6 k5 N" P, z
    ' v9 \/ A" m7 Q# h1 e" J' z$ O
    最终得出的结果是:/ @  n* S% \) U' e% F, T
    方法一:9.8943710327148E-5 秒# r+ p$ {6 `/ c# E
    方法二:9.6797943115234E-5 秒1 N* |8 n) f1 ^/ s7 {
    方法三:0.00017499923706055 秒
    " E8 A, q; [( Y/ c" C  r5 ~  _方法四:3.4093856811523E-5 秒
    ( G% l. t6 P6 k) h( o可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    / D( y& Q# g: J- u- k; F8 T$ M
    ! i& W+ z+ ?) x' O( K. ]& s4 J/ l8 }+ J$ ~! e1 u& I
    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-10-17 08:46 , Processed in 1.980731 second(s), 52 queries .

    回顶部