QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2278|回复: 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,5 M, H# Z0 f0 K, G
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #, ^1 h$ k/ u: e" A
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码# }; I/ u* @. _# J# A% T
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。6 ~3 T1 e* e" j2 B1 C$ y7 R
    view source
    - B& W3 K/ u0 A/ E6 R9 Eprint?7 I" P! ?2 I. O0 [
    " i+ f8 n! c9 l: g6 D$ }! {1 Q- T
    01.function create_password($pw_length = 8)
    8 |7 X4 ^1 k+ @8 M$ x5 ]02.{
    - ?: @3 U, F5 f6 H) \. C03.    $randpwd = '';
    $ x1 t: l/ H3 O9 w; `  h: f04.    for ($i = 0; $i < $pw_length; $i++) , H$ Y9 X7 |7 g# D. \3 E, Q4 M
    05.    {
    ) R& g- P) h& d5 e; g, D. v5 t. I& `06.        $randpwd .= chr(mt_rand(33, 126));
    ! }& {/ U* r' M% z4 {5 e07.    }
    3 V: k7 l# ~7 `2 w( P; r7 J! E08.    return $randpwd;6 r* l4 s- U4 l3 h* Z6 q0 A* _
    09.}
    % Q3 F4 @- P/ V* b3 @  N4 L  \10. ' N& I8 j  U4 o7 N9 M, l( h
    11.// 调用该函数,传递长度参数$pw_length = 66 R( c/ p( J8 t3 Z
    12.echo create_password(6);9 q! o( F! d( r) F2 I

    / v* Q0 H, ~, j' i( A* g& ]0 y1 K9 o& c  z+ P
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符& T+ r, h1 ^- t6 K3 Z
    2、在 $chars 字符串中随机取一个字符
    $ P% }& t$ y1 N3、重复第二步 n 次,可得长度为 n 的密码
    3 }% t6 H7 L7 \view source
    : C7 v  m* I) E+ |4 Y! W" }! Sprint?
    $ J! _% p: y7 b5 S$ @7 @% j/ f% y- k2 g* ?* j9 U
    01.function generate_password( $length = 8 ) {
    4 R/ C" W8 o2 ?9 P) }8 F" F: P02.    // 密码字符集,可任意添加你需要的字符" M% G# z! x1 k' n& Q
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';+ i1 {5 r+ H$ S3 \( N
    04. 4 o( X5 U6 |5 O/ V4 ?0 u
    05.    $password = '';
    ; r$ R3 |% k; M( @06.    for ( $i = 0; $i < $length; $i++ )
    2 x5 E! E2 A( t4 d0 U/ M07.    {
    ; Q( O; p% i2 W' R: D9 S1 C3 p: M08.        // 这里提供两种字符获取方式% v2 u6 a5 ?; u. P; V
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;* [0 Q4 g) O: X4 E* A
    10.        // 第二种是取字符数组 $chars 的任意元素
    8 Y3 A( @4 Q7 D11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);) n' k/ i' \1 n, y
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    + n  U6 e7 h6 a# u" G" e13.    }
    1 z, ?8 H+ z: V$ ?( i14. & ^& V* o+ f' A0 M4 j. {
    15.    return $password;3 i" I  ~- s0 W( J1 e/ B
    16.}, X% s  Y- V2 H' _

    # f& s- W3 N; `6 x& ]/ z6 U" N6 X, q6 j
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    8 e3 S6 j" p7 i7 G$ P2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    3 X2 K' b$ H4 h* y3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。$ x! N( e7 A6 ~5 ^: ^4 P" I
    view source
    . c( y" Q4 ~8 p/ L$ Y* vprint?. ~- e0 V) s& P: Y: D  Z( W! u

    " y7 B( ^7 V# m" b1 u  T01.function make_password( $length = 8 )* H0 M' |5 I4 v& @
    02.{0 N4 I" \3 V: R5 T% c/ r
    03.    // 密码字符集,可任意添加你需要的字符1 ^, H0 j2 _0 b9 S5 _
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 9 }% v5 R7 N# Q% X
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', , a3 G. F% e( T, N/ t! I3 b
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    7 Y5 y! I+ c' ^# j1 j07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', + q; J( L/ I/ {0 @
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',   c4 b# G8 a5 N1 D  d1 |1 ]. Z
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', % r. ]* u  C( ~) g  a
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', , \+ r$ V. Y) R. N
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    : n& L( B0 R2 r1 B% P- `+ w12.    '.', ';', ':', '/', '?', '|');4 \7 \! r# F3 m/ E: A
    13.
    4 b9 e& m% \" D' j- I7 e14.    // 在 $chars 中随机取 $length 个数组元素键名
    2 }1 g5 V" j5 w! c3 E# I15.    $keys = array_rand($chars, $length);
    + q3 g2 G: e3 |7 N/ ^16.
    , b5 @0 Y3 E( s. q! w17.    $password = '';* c+ \  X/ ~7 N) w$ P  J" G4 O
    18.    for($i = 0; $i < $length; $i++)
    7 e' |+ T2 l" ~* P# C+ A19.    {
    0 D2 b; Z/ K, Y- L% M20.        // 将 $length 个数组元素连接成字符串
    1 E2 V4 ]- C( H1 ?; j, \21.        $password .= $chars[$keys[$i]];
    ) J$ [- f* @1 ?' F22.    }
    5 O8 v7 I) W8 Q5 f- |$ Q23. ; m- n% Z- N6 i- C
    24.    return $password;
    ( W8 a2 f' T4 u5 a# ^& Z, O25.}6 m' u6 a6 {4 c
    $ Q+ \9 R. F4 g
    9 S/ G$ S7 Z5 c
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    7 A  A  f+ s. c5 u, ?6 e& |8 O9 x1、time() 获取当前的 Unix 时间戳( R! u# E9 ]7 g; P4 o
    2、将第一步获取的时间戳进行 md5() 加密# n- Z3 S$ q+ D& Z" _, m5 a
    3、将第二步加密的结果,截取 n 位即得想要的密码
    % d4 B2 ]  o1 ~view source( h  L+ `# \7 S) N& a% r
    print?
    0 j1 {9 I! T0 C) i6 |+ m6 q5 e9 o  E. N. t) {# J
    1.function get_password( $length = 8 )
    / ^. y7 I4 W* q: `9 d2.{5 V; v  C5 r- X5 F$ h: o" O
    3.    $str = substr(md5(time()), 0, 6);7 A6 Q1 Z# L  H
    4.    return $str;
    , [4 }% q, A" B& s0 v$ h5.}7 y, |1 a% I6 ]+ ?" ?
    ' r' [) v8 f; h' F9 k
    % Z$ k1 o6 m% m0 h
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。' R$ j0 M; Q+ ]* T" w  [% b
    view source
    , N$ Y- c# D: v1 u# nprint?
    : i; |+ f$ T, ]5 |$ g% c
    / ]! t: H8 {3 k01.<?php, N. [! j- y2 i  v7 U
    02.function getmicrotime()
    ! B) k! `+ U! f! B4 s7 W03.{
    ! b# d! |. O. L, {04.    list($usec, $sec) = explode(" ",microtime());- |2 M/ X7 v" O7 b; J
    05.    return ((float)$usec + (float)$sec);$ P) V/ L( f8 a
    06.}7 t8 k) V* D" `
    07.
    0 a8 x2 I" g7 I! ]3 N3 R* _08.// 记录开始时间  H6 ~! }4 N! o" y0 t& `5 V
    09.$time_start = getmicrotime();
    % r; C& }# {7 j7 U10. . p  |2 r, K! |2 w# Q2 Y
    11.// 这里放要执行的PHP代码,如:
    7 X) n: _: r* X& |! y12.// echo create_password(6);3 E) c& N& b! j. \) I1 F# r7 k  K
    13. * k; V( D, h6 ]! S/ P! t0 J
    14.// 记录结束时间
    ' m* Y5 {, H  U$ O" z$ u2 H15.$time_end = getmicrotime();
    5 e2 n  `1 ^3 ^6 e1 ]: t16.$time = $time_end - $time_start;3 p1 y5 ?. Q2 R% b8 E
    17.
    + s) e1 R8 d0 ]6 i18. // 输出运行总时间
    + Q, A4 F; ]6 u$ w19.echo "执行时间 $time seconds";
    ' a$ h$ a3 r- r7 I% e20.?>
    + C7 H1 x. w7 \3 K; |# S# k, H+ _0 C8 O* p* ]5 _& E
    ! N/ u6 c- t3 {" m& T4 N) E$ y
    最终得出的结果是:: C( L( Z, d8 ?8 n5 ?
    方法一:9.8943710327148E-5 秒8 H2 B) A$ \; c* ?; z
    方法二:9.6797943115234E-5 秒, @/ k0 {+ G& f2 `
    方法三:0.00017499923706055 秒
    ( a; \# Q$ P* b方法四:3.4093856811523E-5 秒
    * S* h  Q) Z4 V! }) |可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。' e) \% M0 h( H+ m* r$ B5 z8 Z
      I4 D& [7 n2 u

    . p8 V4 E" v6 y; N3 E
    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-21 23:40 , Processed in 0.449046 second(s), 53 queries .

    回顶部