QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2300|回复: 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,
    ) m5 a& Y2 _% F1 F2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    * T4 H% T  r* J$ z' ?3 |9 f0 J4 j: [3、重复以上 1、2 步骤 n 次,连接成 n 位的密码4 I( T5 P! o1 R8 c) X) p' _
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。" H* D  S4 P+ O/ Z! j0 ?
    view source: t8 Z* ~) T: d" K( J
    print?
    " g' w3 E" V5 W6 Z
    % Y( M: E' {6 ^' t. s, u01.function create_password($pw_length = 8); j) P' U' Y. T* P+ }8 o5 x
    02.{1 t$ @0 @6 K0 x0 v# y7 @+ X: h
    03.    $randpwd = '';8 ^' K3 j7 K& J; \* w
    04.    for ($i = 0; $i < $pw_length; $i++)
    " G3 w! D6 S3 _9 y! p& \05.    {& }! f7 b$ V! V8 Q3 l5 g+ x" H- W
    06.        $randpwd .= chr(mt_rand(33, 126));
    ( s: B+ T' [+ P# k; H07.    }4 a& s5 G0 j0 p- w# u4 l( W/ T+ @
    08.    return $randpwd;3 t* Y$ t* Z3 y, ?" }2 E
    09.}" u+ X3 Q/ ]# ^, G2 d
    10.
    # _, t  d2 V3 j/ x5 p! w1 _0 ~11.// 调用该函数,传递长度参数$pw_length = 6
    / D, `( v& L0 ^12.echo create_password(6);8 l- b0 z6 p+ d6 u1 U
    $ Z, b  _& z- @* T. P' Z

    $ z- J0 k+ p  u方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符" Q5 g5 V5 q' B: I, [5 U& f0 o
    2、在 $chars 字符串中随机取一个字符
    & c- V8 U( l- Z5 _  u' k3、重复第二步 n 次,可得长度为 n 的密码/ ?4 n) M- t& k2 O7 {: ^
    view source- U0 K" V& e& y) Z; N2 A
    print?
    " |# u9 c9 i/ |( a) ]/ F
    " J2 s8 O( ]  ?6 Z01.function generate_password( $length = 8 ) {
    : j2 ]# g3 w$ K02.    // 密码字符集,可任意添加你需要的字符
    / U/ q2 ~: b! y+ h03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    3 h1 U3 s( w6 t5 s6 L04. + P# P: T# y0 P' D# w! F' |
    05.    $password = '';
    - m% q* n" W+ V0 d06.    for ( $i = 0; $i < $length; $i++ )
    # Z( h4 s9 C* _  P, w, H/ u/ k8 h07.    {% j/ o( o& n. P0 {0 t
    08.        // 这里提供两种字符获取方式
    $ k% w0 |8 {1 {0 @- e+ b: q09.        // 第一种是使用 substr 截取$chars中的任意一位字符;% y5 P- C: o! z; ^/ d, h% w0 l
    10.        // 第二种是取字符数组 $chars 的任意元素
    6 q8 {5 J7 Q5 u11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);; }: j- P+ t" t0 }3 F: R
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];9 d; c/ @/ q+ b
    13.    }1 ~0 {7 ?* I( u& Y# S1 L/ h
    14.
    4 ^2 }* e, y6 o- ?15.    return $password;
    , _6 ~6 g, \' f/ y16.}
    * p: S3 h; `% U, H5 f
    1 k) g: b" _) M- E7 }7 a6 r. s! u! b1 c$ K, F9 Q8 Q! l
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    , f* z, Z7 i# I9 e2、通过array_rand()从数组 $chars 中随机选出 $length 个元素' C% W5 z4 G9 r9 b% M5 I8 k6 v
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    , V( O+ o/ [0 \% c3 jview source( x+ C" N' w6 e' J7 W" n5 f
    print?
    9 _% _  H) y3 W- T4 C& y
    3 G7 ^3 M  M6 q+ y( \! K6 C0 B01.function make_password( $length = 8 )
    / M% f" K& D0 P02.{6 |8 v3 D0 b0 c5 k9 `. V1 I
    03.    // 密码字符集,可任意添加你需要的字符1 p3 r  L4 y# J0 C
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    $ e( t$ v2 A6 z" |1 H  s05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    : ^2 o7 d& P8 O06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    4 }9 k+ W9 j1 _+ ~) n4 n; ?* u# s07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    0 e  G; X# R1 i08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    & N  Y; g; Y9 p- G0 ]09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    + p/ E7 _; ]1 j3 T5 }) F10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    + @& C7 h6 j0 m8 Y( _' \8 i5 F11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    6 l2 d6 i2 o5 d' F3 q12.    '.', ';', ':', '/', '?', '|');0 c1 S: U" E3 U; M7 e( C3 q
    13.
    9 _; R& k5 U  c14.    // 在 $chars 中随机取 $length 个数组元素键名
      S6 z1 }+ x2 }) c$ C15.    $keys = array_rand($chars, $length);
      R7 _' e2 _3 M  g& M# B16. - E+ l- O* o! V
    17.    $password = '';
    ! {0 E* _/ |& t  V' h+ `) y18.    for($i = 0; $i < $length; $i++)
    / J6 t7 t+ D' e( u7 e19.    {
    ; u! w4 N& r0 i. F. d+ R& v20.        // 将 $length 个数组元素连接成字符串
    3 G2 y" ~1 x  y/ Z* W21.        $password .= $chars[$keys[$i]];- H6 k9 ], s, R2 r- K; L! V
    22.    }" `* T) @+ F1 A( A
    23.
    % u2 S/ @/ e( \5 N8 F4 z9 [24.    return $password;
    7 G; }8 ]4 i( ?  b- Z) @  s. ]25.}
    : \8 G4 c# G+ Q! R' Y1 C" A8 S+ z/ \# N

    ! l! \5 E7 g: T. f5 t7 H- g$ Z方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:8 K# k( c% G* L7 g1 |
    1、time() 获取当前的 Unix 时间戳* Z7 w$ V: |2 o* E. S
    2、将第一步获取的时间戳进行 md5() 加密% ]  C% t8 q6 S7 W" h% x
    3、将第二步加密的结果,截取 n 位即得想要的密码, N7 Z4 t: i' k. U
    view source
    ' t1 i- C  ?! ]print?. Z4 V" f9 C" U, h  `
    2 o$ d0 N8 r, S0 y' i
    1.function get_password( $length = 8 )
    * Y2 z% Q4 K/ e' j: F( z2 ^2.{+ G" R/ E3 x- _- R6 f
    3.    $str = substr(md5(time()), 0, 6);0 q! R$ u9 r- T( {
    4.    return $str;: r! ^, z1 U0 {3 m- `% ?( r
    5.}% ]  m$ ~) \% C- t5 k2 p- @

    ! P0 l/ a+ @! l/ \$ Q9 b, \9 L3 U4 ]+ F) Y0 x, i/ J6 c0 @, m: k
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    2 \8 j8 i6 V% U1 _view source' |; {$ [( N, l
    print?6 M/ w6 K3 t: X/ t4 _. N+ {* d5 O
    ' w/ t' L/ n* B7 r$ H
    01.<?php
    6 N# A  E$ v! h" @8 b5 s; K02.function getmicrotime()* Y$ B; i  ~, @) N$ p4 w8 E7 s5 O- P
    03.{1 x) w9 t* s+ P# y- |& B9 I
    04.    list($usec, $sec) = explode(" ",microtime());$ v6 H  F! f' L0 }/ c# t
    05.    return ((float)$usec + (float)$sec);: e  X/ a8 f. z/ u7 \! W5 c
    06.}
    - @9 H0 z$ x: P* W07. 0 n9 P* O* M1 R
    08.// 记录开始时间: I' `- F& A, I9 p
    09.$time_start = getmicrotime();. [& y& u" z+ r
    10.
    2 v& Y9 e# c' o9 I' C6 `11.// 这里放要执行的PHP代码,如:8 d3 }* [" q. U6 G' ~+ \$ t" E1 c
    12.// echo create_password(6);
    $ ?# E1 q8 c& |. }13.
    & ?  \5 b8 v$ u  T14.// 记录结束时间
    8 V0 ^' Q( k# s  L- p! ^15.$time_end = getmicrotime();5 T4 @- u2 _* r
    16.$time = $time_end - $time_start;
    : ]& |( S+ w. V( M17.
    ! G& _3 e/ @+ U18. // 输出运行总时间 ) z5 B  _7 F" ~+ m$ N9 m
    19.echo "执行时间 $time seconds";
    9 d4 D$ \% v' l1 c0 i8 j1 C1 |20.?>! Q) b" M; f% d, d+ A
    # K; [1 f  v* u  X. a
    7 d- B8 Z+ o' u. O$ r8 V& u
    最终得出的结果是:5 Q  n& e; ^3 j, w# i. Z
    方法一:9.8943710327148E-5 秒
    * w  N( n2 s. o- F  y" t3 q方法二:9.6797943115234E-5 秒
    % Q: v& j7 C2 m1 R. z- P方法三:0.00017499923706055 秒# b8 c" f6 Q9 {5 H( S# z
    方法四:3.4093856811523E-5 秒/ h4 k# p: G  {1 ]" |
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    2 I: f) e6 p: Y' ~5 p% }
    7 j$ K/ O) D5 J$ F3 k5 J/ I# h/ t5 c6 \# U$ W3 @* u9 Y
    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-5-25 19:20 , Processed in 0.383534 second(s), 53 queries .

    回顶部