QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2264|回复: 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,' O  n+ L; }  }; L
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #9 w1 w! ?5 i6 D( M- K# g" ^% r
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码1 y$ ^8 ?" T1 _5 T. |1 A. u# M
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    , _- i7 j* p" r7 Z* J( O# y, @* nview source5 Y" K* q) K9 h: o: v& ~
    print?
    7 v' I- R; |& g4 C' z
    * d! Q+ f4 B# Q4 B. S01.function create_password($pw_length = 8)
    " C  l/ K5 t0 f# h: g/ @02.{
    3 b, U) n0 G+ b+ u6 s/ P" E03.    $randpwd = '';- x# l( m- R3 P2 a* J: f4 Z
    04.    for ($i = 0; $i < $pw_length; $i++) . ?: j- X. b- m6 @$ s  K2 P
    05.    {) }5 R# D5 w" q5 [
    06.        $randpwd .= chr(mt_rand(33, 126));! {) J: r) }7 F. p( Q& f
    07.    }
      [/ n' q% i, O08.    return $randpwd;
    9 ?- d* ~- E/ h, h09.}3 l9 h- \$ B+ t6 q6 k# k
    10. . K) r7 g! ?) e9 w* Q9 K0 Q
    11.// 调用该函数,传递长度参数$pw_length = 61 z: D" A: I; U' d
    12.echo create_password(6);" K; _! Z8 ~; O& v( O7 }

    2 Z% I2 m: r. u2 j
    1 r: z, d6 G. I1 D方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符: Q! D" C- o/ z' S- `; h; }( ^
    2、在 $chars 字符串中随机取一个字符
    . K0 C8 L( K- }0 {3、重复第二步 n 次,可得长度为 n 的密码2 D3 |" i: g$ H3 K; ]" C8 l" m% a
    view source$ y' V8 r& T8 M" {
    print?& _3 K* J& m/ h! Z
    8 i  D, r/ T$ k" a3 N
    01.function generate_password( $length = 8 ) {
    ' h6 P( ^- n  h# U% F8 n02.    // 密码字符集,可任意添加你需要的字符
    - O2 Q, E# @  D8 Y! [03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    7 w) f. z4 \2 y4 c( C04.
    " {! r' H# c& P; }05.    $password = '';& ?& c0 ^# X. ?" l% b! a! {
    06.    for ( $i = 0; $i < $length; $i++ ) : |7 H7 i2 V- C) G! I; U( @
    07.    {1 C/ M( s' m# @' e$ ?8 r
    08.        // 这里提供两种字符获取方式( K6 D4 c* K; v' O' R. L# c
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;& \9 @% \: q( A% F/ b% ~
    10.        // 第二种是取字符数组 $chars 的任意元素5 m# K) e" u: T
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);( l; W! S+ {; v1 Y) O% b! k
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];% M  v' b: ~" a1 a; X2 I, `$ C
    13.    }+ {! O) l3 C1 n: j! {; ]
    14. ) A! h$ \/ R: u. T: v3 h9 F
    15.    return $password;
    5 ~! Q) ]5 F" e5 l9 B9 U16.}
    : F2 a; C& ]# E( A+ S' u  |2 D/ c
    9 Q7 l1 _: X' C5 Z3 C
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    / y& t+ c# [3 U# J- x( q* d2、通过array_rand()从数组 $chars 中随机选出 $length 个元素4 j; s. I. ]9 t5 B* S( v) M
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    ) n. N' f' ?7 m2 i& Q7 Uview source. T7 x8 b5 S" {$ c- v! b* H4 m) `
    print?
    2 W0 a. S' p4 P! L, W1 k" q, N! Y: T' C3 n( F  M
    01.function make_password( $length = 8 )
    2 k1 ^- O2 N% [  P! p02.{
    + ]4 x* d" C& Q# S1 o- u* ?1 B  n1 Y03.    // 密码字符集,可任意添加你需要的字符
    # j' S" B5 v( R) f0 D/ i7 T04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    % }1 \- {# A2 @' R05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 3 \. b+ d: U$ g
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', : e8 s3 `4 l! Y% C% C. Q) n# |: ]
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 5 Y. b3 U- G" ~- i6 \  \
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 8 Q( [( e7 [# t6 `
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', - t+ w9 u6 ^/ R2 m* s
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    - @% U/ k/ P- y5 ?11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    ! E' Z; h$ R% m( ^9 u  Z$ x9 n12.    '.', ';', ':', '/', '?', '|');! ~& U9 |6 `) W5 _
    13.
    4 J. |: @/ E& b3 b14.    // 在 $chars 中随机取 $length 个数组元素键名
    ' c& `0 ]' `2 C& \. ~* T7 `( Y15.    $keys = array_rand($chars, $length);
    / {4 w; _; P) M% N. E16. : F4 Q# P4 h0 S  q6 x
    17.    $password = '';8 U: U' f  ^  ]* q+ v0 P6 Y" J
    18.    for($i = 0; $i < $length; $i++)
    + a( ~7 T8 F/ [5 b# c$ A, G19.    {3 }' l1 z: i  W( {! s# r
    20.        // 将 $length 个数组元素连接成字符串
    8 m$ q$ @1 j) H3 b5 R! a1 Y, ]1 c21.        $password .= $chars[$keys[$i]];
    ' Q2 H% |2 h, e- z8 p1 K22.    }
    - i9 }' I3 S2 P23.
    $ e0 _5 A* f" J24.    return $password;5 _8 q1 V( b8 y9 l1 c8 C  C
    25.}
    ) L8 |; c. `' r9 [, E2 M0 A+ E4 i  C4 W0 |) y
    1 |5 g. o) V5 w
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    $ K9 e1 }, C# Y1、time() 获取当前的 Unix 时间戳
    7 W1 c  D+ {4 g3 p0 z$ F6 C8 N9 a2、将第一步获取的时间戳进行 md5() 加密
    ! `- \  G' |0 E- o/ @! u$ C+ G. u3、将第二步加密的结果,截取 n 位即得想要的密码
    7 k# V0 x" m( s) s# S. Pview source( u/ B( Q' |0 d& R5 T, C
    print?- P- l% ~0 l* m" f! e4 t+ h

    * {& k1 ~" F& ^8 {1.function get_password( $length = 8 ) 4 U7 p0 Z* f: W& f; b, ]' \
    2.{  _) x  z2 g  N' F6 Q- f3 x
    3.    $str = substr(md5(time()), 0, 6);
    , x! M; r; T, m2 b4.    return $str;
    0 c; L/ |0 {# S6 Q8 \5.}: y2 i$ P: G( r0 K% Q6 e$ I( A5 I

    + V# E8 W4 q. `4 ?# N
    " H3 J7 n1 T" w$ m) h时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    . K1 y" j1 e% m! Kview source
    . k3 L( a4 r, J$ E- U1 ^print?& E7 ?# x! C$ d( M6 c4 h2 O! H
    7 |( b  }# T2 _5 f& W1 v
    01.<?php
    1 V5 f0 c7 p& M4 Y5 F# C; _: D02.function getmicrotime()% P0 c, Z$ O; N
    03.{
    3 _6 }9 G8 t" M# \04.    list($usec, $sec) = explode(" ",microtime());
    0 v1 @' P; ?5 \8 L! _; x, \( N05.    return ((float)$usec + (float)$sec);
    ' I4 N! H& G6 Y06.}. \; S$ ?. `: t& V- o( b
    07.
    8 h7 i: i. H5 g6 Y9 t08.// 记录开始时间
    9 H! W$ S0 H" w1 f09.$time_start = getmicrotime();' h5 L$ B& M# m# P" `
    10. 2 f9 d# R. a+ v/ N5 U. m
    11.// 这里放要执行的PHP代码,如:" ?' O9 S! @* J5 \$ a3 ?6 A" k
    12.// echo create_password(6);% i" G; l3 Q3 @2 S1 S" T9 N" C2 C
    13.
    / [7 N" h: |! n, T- p0 _14.// 记录结束时间
    4 a/ a9 ^+ c4 q9 `, @7 d5 S15.$time_end = getmicrotime();  D# ?& _9 O: Q9 W
    16.$time = $time_end - $time_start;
    * B9 q  b% O% }17. - p2 r/ W. X' u- W
    18. // 输出运行总时间
    4 d# K6 ?+ H& Y- U19.echo "执行时间 $time seconds";
      X0 U: k8 g; @20.?>/ v  a6 r/ @- g% p

    ; }  i3 W* v$ o
      y5 [* A- D6 c3 m最终得出的结果是:9 r- i: r; ~2 n- e# d
    方法一:9.8943710327148E-5 秒" l# j, J" ]7 G7 I
    方法二:9.6797943115234E-5 秒
    : F  Y( m# e+ l# B方法三:0.00017499923706055 秒* k: K" H# Y4 w) A$ c
    方法四:3.4093856811523E-5 秒, A. R: m( f% D5 D- Y9 ~
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。& z. T# y* w) e. l

      {- l$ d, A* a( |$ T% n7 x
    ) N0 |( N0 b) J( X: T  h, _* 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-4-10 17:50 , Processed in 2.028619 second(s), 53 queries .

    回顶部