QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2309|回复: 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,
    ( i+ P& ^5 p" {3 _2 Q2、将 35 转换成对应的ASCII码字符,如 35 对应 #
      `  \* _7 m% w! [9 k  K/ u' a3、重复以上 1、2 步骤 n 次,连接成 n 位的密码5 v& {  M4 e& m+ U5 o& f
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。2 `2 A) s  ?1 E
    view source
    + N# q( B7 G2 M* a, l6 r$ G; o& {print?
    2 e# o6 e8 {# T! f0 u( n7 |* n6 _, G. I% |% H; @3 Z# P/ L
    01.function create_password($pw_length = 8)* q+ X( L3 q% i) D+ w/ x( f2 q
    02.{
    ! S6 ?5 s0 `+ Y* a  e03.    $randpwd = '';2 o% J* X1 Y0 p! T3 L
    04.    for ($i = 0; $i < $pw_length; $i++)
    - M" v. R9 R# Q1 q$ Y1 I" \05.    {
    8 z0 b$ u% T5 O06.        $randpwd .= chr(mt_rand(33, 126));5 ~1 ?% K7 j0 P0 i1 v
    07.    }
    , a0 X7 z6 U" a6 P' u3 x9 v9 m08.    return $randpwd;
    $ k5 }8 F  Z" i& D1 U) E: R6 \, X1 I$ I09.}
    + [5 ~8 M& _2 |10.
      O3 e) E% ^' H* |2 y11.// 调用该函数,传递长度参数$pw_length = 6& O& @/ g  ?+ w
    12.echo create_password(6);. J' ]3 i9 l7 ]& _/ F) f$ V! A
    ( {2 ]% }3 y: E, o9 g0 l
    * V! g6 k1 o7 B- Q6 g
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    - X; s* ?& `4 q" S# |$ B3 N) g2、在 $chars 字符串中随机取一个字符# S+ f  `. q3 q* P2 S4 l: p
    3、重复第二步 n 次,可得长度为 n 的密码
    9 H& |) b1 ], Dview source
    - c3 J+ X  X% f8 q' A% Wprint?
    7 U1 M# N1 ?7 E' @" s2 B( I. }2 O+ v/ p! [4 L5 B
    01.function generate_password( $length = 8 ) {2 \+ [  C0 B2 o$ e
    02.    // 密码字符集,可任意添加你需要的字符
    % s# D6 v) F7 M' i. I( r03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';) t( ~* \* H0 Q  X+ G  l% p9 r
    04. ' G0 [  W; f7 I* T& P" \) F
    05.    $password = '';1 M% j5 K5 n4 X
    06.    for ( $i = 0; $i < $length; $i++ ) / z  Z& H, F+ f6 e: j
    07.    {2 E$ r/ M) {8 a9 D) Z" [  w8 L
    08.        // 这里提供两种字符获取方式4 m" E* u7 \5 W+ R& b
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;; h4 s  Z0 g- T% |. o
    10.        // 第二种是取字符数组 $chars 的任意元素2 |, p% L8 }; @6 w
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);* Y+ I' K1 g# A
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    2 D: ^  n. j+ B9 S3 [: ?1 i% q13.    }+ F9 w4 N; y' r+ `3 T
    14.
    : m, W6 K8 I! o! u9 B3 E4 S15.    return $password;, q; y& k2 Z5 `6 ~
    16.}1 d/ _$ C, @3 S4 U+ ^

    - ?" `& F0 q1 h9 K7 J) k8 o+ }) L0 P7 ?4 x' r, Q2 h! n
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符9 f2 T* [4 a0 v( Y0 `1 j& m
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    , E4 T3 R* T+ q" Q3 h3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。- _. H/ ?9 Y, g4 {1 o  {1 z
    view source# U9 l7 A/ o- s) F0 ~* d8 y
    print?$ D8 ]! T3 Y3 v5 S- |/ Q

    " H% ?/ K7 c5 B, B0 f% p) a01.function make_password( $length = 8 )2 I: M3 N$ }: U. R: m6 D: }2 S5 Z
    02.{& L# a  g5 E( V$ Q2 |
    03.    // 密码字符集,可任意添加你需要的字符; y* [3 ^0 f! _) i4 V; t
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 9 r# v5 r/ {( Y9 `
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 8 }, Z; B: X2 J) ]: O
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    * N. y4 T, K. q5 H  y07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 8 b9 O9 V4 `& f% e, j- o6 t9 P* e
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 1 H( }1 u' b: y/ _
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    ! u+ a9 W6 }3 i. P4 L5 _10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    , p! L  @+ p" h: k/ x3 F11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    . ~* V6 P: c. r4 V$ w6 m- ?( ?12.    '.', ';', ':', '/', '?', '|');  f; K* w' P" _# k
    13. + F8 e, R' ]: V
    14.    // 在 $chars 中随机取 $length 个数组元素键名+ Q& G- L' |0 W# o3 a' B! S- y1 H
    15.    $keys = array_rand($chars, $length);
    1 c6 E; g+ K, x- Y1 E* l; y16.   X5 o/ l6 F7 d( W4 B
    17.    $password = '';: i# W3 y. v; m) N
    18.    for($i = 0; $i < $length; $i++)
    % c, k+ m! S& m' x4 b/ O19.    {% `7 g7 T% n8 T& J% a$ c; i3 f9 _: C
    20.        // 将 $length 个数组元素连接成字符串5 i: @+ X  X& E6 v' p
    21.        $password .= $chars[$keys[$i]];
    & s. Q/ Y* w; B3 w' E7 L' T22.    }
    ( G, o& |8 S' B& u2 q23. 4 F! j+ g/ U8 f+ z
    24.    return $password;8 v1 a7 f. l& G& O1 Z- O
    25.}
      h8 \! N* {  K' v( d
    % ?* r) U* T9 _* q  v
    ' x* m# c$ Y. y+ E; U. l方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:) h' I6 L; B- I, p2 d3 k
    1、time() 获取当前的 Unix 时间戳
      c1 f& `- _2 s: q* @0 q2、将第一步获取的时间戳进行 md5() 加密
    6 E* B7 j; G1 s. R' ^) v3、将第二步加密的结果,截取 n 位即得想要的密码) N& R3 r. R" X. T
    view source" b6 v/ J+ `( ^( R- a0 q9 M
    print?( K( s0 D4 O. z

    6 [; v3 z( ~6 K# W/ Z  P6 N! T% B1.function get_password( $length = 8 ) 2 i4 U. ^1 I6 ~4 `& A. M; r
    2.{
      |, C4 I# }* o+ e0 ]: E) l3.    $str = substr(md5(time()), 0, 6);
    - ~7 G7 H1 p% m9 h- a' _4.    return $str;
    4 r1 }% e+ P/ L3 h5.}5 }8 E0 V; B. \/ f1 j$ S& L

    $ h& N! V7 d1 I8 e/ t
    / w3 U$ d3 E, F! j6 R时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。+ F; l! F, h  s0 x
    view source
    ( ?$ s2 C; D% Vprint?
    ; e$ E& H/ A/ [  u7 A$ M
    " T. Y( L2 F1 X) E01.<?php+ |2 x- f  _! F" U9 o* O5 E2 l
    02.function getmicrotime()
    + k6 j- ?+ V) l1 b6 U03.{
    + @) }- e& G0 r1 m) N04.    list($usec, $sec) = explode(" ",microtime());
    3 v1 N- J" `# Y( j: r+ L0 s" D, {05.    return ((float)$usec + (float)$sec);* G  q: ]$ `# }2 O; z+ U' k0 u" T
    06.}* p8 z" x) }: X0 U* ]% D
    07.
    . p2 B* f9 [' y, h! Z; a08.// 记录开始时间
    5 [6 z& }! H8 J$ u. b6 N09.$time_start = getmicrotime();4 r: H3 N* w* K- J5 J
    10. ' D3 N$ s$ D$ X+ ?
    11.// 这里放要执行的PHP代码,如:+ A1 s  v2 i% E/ t4 e
    12.// echo create_password(6);
    ( ^0 v/ t/ {; p1 j% a2 i2 d13.
    ' @- j, j9 v, }9 B* s, l7 x& v' ?14.// 记录结束时间
    " b7 R& ~3 s" X. `& C3 Q8 ?15.$time_end = getmicrotime();) H. u3 A! u# P
    16.$time = $time_end - $time_start;
    0 m& `8 z6 r* Y  N: V: ?. \5 b17.
    # H; d$ B: m* Q  k0 q18. // 输出运行总时间
    0 a8 e$ y. i% A4 o8 f' D& w, X3 D19.echo "执行时间 $time seconds";1 }" ]- I4 d) q7 c' L' P
    20.?>
      N' u3 h" U7 m% ], C) R# z3 `. u
    & x! V* H+ S2 k1 A: U: Y" s& W3 n7 E% f9 E8 F6 H* ?4 K8 E( P% O
    最终得出的结果是:
      _, |7 l# P; p6 D3 N方法一:9.8943710327148E-5 秒9 H9 X. L/ X# }' d* A/ l  Z
    方法二:9.6797943115234E-5 秒1 J5 N/ y* A! T- A( ~
    方法三:0.00017499923706055 秒8 W0 s7 |. o2 q9 z" I9 B
    方法四:3.4093856811523E-5 秒
    ( W; R8 X, S$ z4 t8 ?可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    $ n, L% [, l' N, B2 _6 _  m" U! ~6 ~
    & s# p; J, c* 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-6-16 03:47 , Processed in 0.483822 second(s), 52 queries .

    回顶部