QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2092|回复: 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,
    $ ~+ k; m) b9 U  }# X: _  z0 G6 @2、将 35 转换成对应的ASCII码字符,如 35 对应 #
      B, w, p* y! a7 X3 ]; h3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    ; f( @7 I7 Z% U5 ^5 I; J该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    3 Z9 E7 m2 Q0 |0 U9 S6 [view source
    5 k' J3 G% @  j: p5 Jprint?% k. U- W9 b7 t6 q# b4 V

    & l6 U) ^$ n% x) b# y) V  V5 }01.function create_password($pw_length = 8)
    ! E! B9 R9 V! M7 k) ]* G02.{
    ' n- |; j+ r: ?& l! A7 S  s" K- ?* u03.    $randpwd = '';. ^! [, D1 ~- j
    04.    for ($i = 0; $i < $pw_length; $i++)
    8 w) |+ U  a& e" m05.    {
    3 d9 j: o4 X$ ?+ f. V8 S% f) a, z/ w06.        $randpwd .= chr(mt_rand(33, 126));
    9 M  |1 \* ]! D5 v4 z% n8 R# F2 E07.    }
    . E9 n; K; {6 @08.    return $randpwd;7 v( ?* E3 M# S
    09.}
      l5 U% i4 @# d9 k  P10.
    1 f+ y  _4 A. R# Y' D" R11.// 调用该函数,传递长度参数$pw_length = 6
    $ [1 O0 e4 u7 L0 X6 q% K12.echo create_password(6);
    ) w# m7 m5 |6 c5 D1 u( R2 u5 v2 w$ l. ^7 o( a3 q1 W& r2 N7 R# Y

    2 R: s; m/ J* g方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符5 O. o) V' t1 x% e
    2、在 $chars 字符串中随机取一个字符
    ( o; H1 B: u. F1 D" I. y3、重复第二步 n 次,可得长度为 n 的密码- v: q2 B: D5 T* b& I0 P/ K# ?
    view source& g- i: m9 I3 r) p# t
    print?
    / p) s% b, U! l% [4 Y  @- X/ K, U
    - ]& z) _8 S. K6 n7 S( L4 Y) g1 A01.function generate_password( $length = 8 ) {
    " v! a/ I) }, N$ R3 g: M02.    // 密码字符集,可任意添加你需要的字符# A# }9 E+ G3 D, i
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';8 ~1 V/ a8 E% y6 H( O/ _( s& U
    04. % D  p# p) Q+ R8 D
    05.    $password = '';4 d, s% l1 R+ W0 ^" ?: V- T
    06.    for ( $i = 0; $i < $length; $i++ )
    0 A$ m2 t" h* `! Z/ [1 v07.    {
    3 P& r8 o7 q7 h# Q. Y% Q08.        // 这里提供两种字符获取方式$ C, Z, p4 P1 ]) x5 V' T4 c9 I
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    ; x$ B  l2 y; U" n7 L( b10.        // 第二种是取字符数组 $chars 的任意元素% n# V* L. D: q
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    * `( Q# e$ }$ s! W0 R# k! X12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];2 l8 _2 A( c3 B
    13.    }
    ( n: R* v+ Y  s14.
    : X& P! ^  g0 q( V( g, b5 C6 ?& U15.    return $password;
    - ]4 g  n! |& Q+ v+ L5 V( b16.}$ T; |* T) X6 s: ?$ ^8 [6 M

    1 B/ G# b6 o; Q8 ]! G$ q) ]2 i) g( U
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    ( z8 ]3 ]5 E1 h9 [: O0 R* {& S2、通过array_rand()从数组 $chars 中随机选出 $length 个元素+ Z5 Z- T! l+ G6 ]
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。* b! U7 x7 [  Z$ ?/ C3 G0 u2 u  }
    view source
    % p9 y" j' Q/ u/ q" a2 j: I6 oprint?' r, j/ i/ }) C) u& r9 }! K! Q8 k

    # y+ w' S. W" L6 h01.function make_password( $length = 8 )! Z% }! x, }1 e9 X
    02.{
    9 f$ S5 x8 @8 p, V6 o. \" b1 p& N9 W' k03.    // 密码字符集,可任意添加你需要的字符
    * d' z9 [# z5 z7 y04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    ! u1 O3 T# s- i% k. }- z05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', # U; B# v& Y# t) y
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    ! n; ~- j1 I7 e6 k5 B- J! X; L07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    ( b2 {3 r  G) M7 a, ~/ V4 [08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', * W! V0 ~. O; z5 n6 I
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    3 @" h7 a( D* @, e10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', ) H- P, k9 m/ X) P& |/ w6 W
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    ; G  \7 L8 K6 a12.    '.', ';', ':', '/', '?', '|');
    " j# f0 x. \( ?* y" ]8 z& I13.
    - ]3 W, X2 A# f# W1 X7 F14.    // 在 $chars 中随机取 $length 个数组元素键名
    / \5 F7 f. t4 [5 A! C9 K4 k- O  N8 b15.    $keys = array_rand($chars, $length); : m; G/ x/ Q. [/ z
    16. 6 B. W# N8 l* N$ t
    17.    $password = '';3 F1 z& f. }# \# D$ K7 z1 S
    18.    for($i = 0; $i < $length; $i++)6 B$ A+ x# Q! m
    19.    {3 ^# C5 I3 {$ E* j. l( U
    20.        // 将 $length 个数组元素连接成字符串
    ; [  l8 A% N1 I' ~5 E) ?21.        $password .= $chars[$keys[$i]];
    % m5 `, o. f7 M6 z22.    }2 L: n9 N2 z; [1 n
    23. ; G7 J# Y6 }4 Y2 j8 O8 I
    24.    return $password;
    ( [5 M  ]& l" V" u1 M/ L25.}3 j$ I- Y9 G5 Z% N/ w5 B/ j, e5 U
    0 \! N# }: j8 c' a% n5 Z
    + [) R3 f$ e5 N* y
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    3 `5 |  Q: X& H% X2 J2 ]1、time() 获取当前的 Unix 时间戳
    , b" X- @. u, Z. s$ q: A2 [2、将第一步获取的时间戳进行 md5() 加密' c" ^+ U; T, Y8 {, \8 e* A
    3、将第二步加密的结果,截取 n 位即得想要的密码
    3 |6 [6 x# O+ i& r6 G3 r/ Gview source4 @6 Q+ X7 \% b- ~$ s/ d
    print?6 L( \- t2 z+ f6 o, K0 o# |- U

    & A, g, b6 F' Z* R, G% X1.function get_password( $length = 8 )
    $ X$ d2 O: r  r9 x- W2 I% L2.{; }$ i. U0 @5 a4 T7 F0 l
    3.    $str = substr(md5(time()), 0, 6);
    " h9 D7 {# b6 D% {( y9 r. {" b. I4.    return $str;' M8 l+ ^: q( J, [- T& J# x
    5.}
      N- v7 g6 D+ Q6 ~+ R7 C* W% M' w" k. ?7 m" |+ e8 R
    7 r: c# i9 S9 N, y
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。2 f" B8 D3 G. \
    view source) l0 d0 t! L7 F$ j- y1 `2 ~
    print?# u3 [* f3 l# k1 H

    3 ^$ G! e. a6 H: o3 T) f9 L6 a- H4 z5 v6 X: D01.<?php
    4 }* M. i+ {1 ^% k9 X3 _02.function getmicrotime()
    0 K0 f: V; d/ ^' B- E03.{% R/ S  N' A: E: K
    04.    list($usec, $sec) = explode(" ",microtime());
      _; [! a% v" s05.    return ((float)$usec + (float)$sec);
    % P% `+ Y4 R2 @06.}
    9 ?. F: {' f- b  a& i, E07. $ p- c6 W) o7 A9 |, m
    08.// 记录开始时间+ e$ F" @1 a+ Z* C8 a
    09.$time_start = getmicrotime();
    4 m. g) R& P0 o4 d7 R: {10.
    : q: ~+ ?4 J: t, }7 J  x! \1 Y11.// 这里放要执行的PHP代码,如:3 d& C7 }2 R9 R, W
    12.// echo create_password(6);
    , K0 G" _" J: i: Z# K* |13.
      X# u& l3 G% V( J3 A& i, ^' M5 s! A14.// 记录结束时间
    # c3 Q9 z. o: d" p7 h0 m8 f# T. G15.$time_end = getmicrotime();
    % }, M7 o5 E1 b& l16.$time = $time_end - $time_start;" f9 ^8 H2 }$ J% T* N! G
    17.
    , _# v$ l# e% H18. // 输出运行总时间 6 d3 @2 J( w5 l$ S' t( Z/ h- p
    19.echo "执行时间 $time seconds";% r1 I6 h  ~6 q5 F6 M
    20.?>: {! \0 c) x" c$ u9 [
    $ F' T; y; t% c, `& C2 }* ^0 I1 C
    & h) J7 }3 r7 [2 X; }4 P
    最终得出的结果是:
    ) q6 f  R% F$ p# h4 f7 _  p% X方法一:9.8943710327148E-5 秒
    ! A5 H& q( F" g( P% x& j: H方法二:9.6797943115234E-5 秒
    * u5 h4 u1 C! @) M2 K方法三:0.00017499923706055 秒
    5 H) x# ^/ H4 g9 t方法四:3.4093856811523E-5 秒
    & E8 e8 z4 X5 @$ Y/ j. A可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。- m8 |% g, l( v7 z
    0 v" ]8 i- z6 m- e7 V) U
    7 L) g# [7 e6 X
    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, 2025-10-25 17:50 , Processed in 0.711387 second(s), 52 queries .

    回顶部