QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2311|回复: 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,9 \! y& ]: I1 n3 l( T& L8 x* P9 x1 ^
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    * |( r& c% G  J4 w3 o; j* Z3、重复以上 1、2 步骤 n 次,连接成 n 位的密码1 D$ R9 G; c6 p9 h) t+ Z$ `0 p
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。+ v6 _$ ~7 i  l8 \7 p
    view source
    ! A- C! n6 R5 Kprint?
    & p! S( S0 @! E9 Q, D0 i+ j
    4 L1 a$ k7 W  L8 J, X' o01.function create_password($pw_length = 8)9 l; @- O( `% m5 l% a. ?6 q& Y8 E
    02.{6 x2 l- [; k' s0 N" J) N
    03.    $randpwd = '';
    4 L4 j. _( w5 i& x& \% ]# a7 T3 r04.    for ($i = 0; $i < $pw_length; $i++) 4 q" ^$ k, p$ B& c; {6 V; i# G6 w
    05.    {+ R* ?0 D% f1 @1 R0 h6 t& V
    06.        $randpwd .= chr(mt_rand(33, 126));) a- n5 \4 u; Y/ U1 l- K; N% ?; O0 @
    07.    }; Q& _1 r1 ?1 j' O1 W+ ]
    08.    return $randpwd;" W4 C; [" \/ L& A
    09.}* L  j- n4 [: H6 x, m
    10. " \; J2 w" n$ q' E0 ?. q" S5 Y
    11.// 调用该函数,传递长度参数$pw_length = 6
    % B/ X& B% v. {8 j; q9 ^12.echo create_password(6);
    & v2 }  Q, A. B6 ^; ]2 J, @$ u* K7 e) t, Z$ \. c0 t4 _6 U: P

    , }% I0 A/ @* ]9 V/ {3 A方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符1 B: p7 F. y; J( s2 f
    2、在 $chars 字符串中随机取一个字符
    ) N( {) M4 [1 a) b: n3、重复第二步 n 次,可得长度为 n 的密码
    9 \; [$ t4 m; H+ }  K2 d3 mview source2 I! n7 B! W8 |+ x) |0 b
    print?$ ]1 M6 s, D9 u4 Q
    % M5 s; x: j; u1 z' P: Z1 l
    01.function generate_password( $length = 8 ) {
    1 S" O) `6 e) l02.    // 密码字符集,可任意添加你需要的字符! b0 G' L0 T5 g3 _* u
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    + e# e/ }6 q5 n5 [! n# m04. 4 d( K. P1 m, `" d
    05.    $password = '';
    : p7 K$ r: s8 f8 w5 J% V/ [06.    for ( $i = 0; $i < $length; $i++ )
    $ i: ]$ I, f6 J) M+ d07.    {
    & P: ~2 _. `" }2 B9 w08.        // 这里提供两种字符获取方式0 f4 n2 b) n3 X
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;% D$ f5 C, C( G
    10.        // 第二种是取字符数组 $chars 的任意元素  m, F( y# A5 y/ Q4 E. m: w
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    + D: G2 J# s& J( z8 p; O" s- W12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];. W7 h% x7 b* F$ G- `. N  k* W, f
    13.    }
    " J4 o, O1 V2 f% j  m! l14.
    & a+ t! U8 ], E: E15.    return $password;4 Z7 f. f) G$ Y6 ~; L6 j# \, D1 n
    16.}
    8 U4 M) F' B! }) V' v6 {' V. @4 v1 ]7 ^9 {& k4 h
    3 O2 Z% K) L2 e; B! r) [  _7 G
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    5 y( l2 S; [' T1 B2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    9 D4 d) P: F) E: C6 G) F3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    & e8 a+ \* Y7 _' }- s9 Q/ cview source4 P7 M9 M( ?0 o, ^, O% w
    print?
    3 d6 p5 T# f( J
    ; b, B0 [# g3 Y4 e$ c2 y) A01.function make_password( $length = 8 )
    " s3 P) `+ s# M% r9 |& h02.{: W- N8 G0 n) o6 j0 X' P
    03.    // 密码字符集,可任意添加你需要的字符. Y5 D; B, [+ X; Y
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', $ K: T- Q! S8 q1 d7 R6 d6 _
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    ) q9 c. C4 K" I; C06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 2 ~/ S7 P1 I* N6 u' s$ Z/ u
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 7 d3 V5 t) w1 R5 a1 ^6 K" Z- }
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    ! m0 j5 r1 L  ^( Q2 R& d09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', . ^5 G; e5 n7 i! |$ U! ^0 c! o
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', + o" {5 r2 z: Y, G
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    . d9 Y) F6 G) U6 W6 e( H12.    '.', ';', ':', '/', '?', '|');
    $ J7 P+ w* A8 S13. 2 J4 J% d) D  f. p6 E5 B
    14.    // 在 $chars 中随机取 $length 个数组元素键名! L% k5 b  @. Q; \& ^5 N1 _
    15.    $keys = array_rand($chars, $length); 9 _# l$ r$ c! r& k( c. [/ U+ a! ?
    16. 5 u" G4 M! T& j' K: t1 ~3 P
    17.    $password = '';
    & Y5 E3 Z. a: b/ g* `& x% U18.    for($i = 0; $i < $length; $i++)
    8 T% [, @! y; n6 {19.    {
    5 H" M- {& K/ x: E, C0 ~% p4 B20.        // 将 $length 个数组元素连接成字符串
    6 S2 ~) n7 Y5 f+ e) i21.        $password .= $chars[$keys[$i]];
    $ Y3 y1 n/ W( }22.    }; x9 S$ z, D. s  N
    23. / D& n5 c3 z+ [3 J3 I# j
    24.    return $password;0 J8 H) j& i8 ]( U, z  ~
    25.}
    - ?, @( g5 [) X4 A( \2 E* u) S! v1 ^
    ' o: F. n7 Y1 _
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:& ^' r  `& E& X' |
    1、time() 获取当前的 Unix 时间戳
    ( y: u' s! d' B2、将第一步获取的时间戳进行 md5() 加密
    8 u  f+ s: U* }# E3、将第二步加密的结果,截取 n 位即得想要的密码
    : t6 }, ^/ v5 ]% V+ w9 Oview source
    ' S6 f1 E, d1 C* J2 H( Bprint?
    & M/ k0 l+ O. j! d( x( e) |+ V& j5 h0 k8 `
    1.function get_password( $length = 8 )   E& l  ^6 W( z" C% N. W) o
    2.{
    & l0 [% d: y. g5 n; o* Q6 G3.    $str = substr(md5(time()), 0, 6);
    * I6 i2 j/ ?: t  C8 k4.    return $str;# J7 J" J/ D0 V8 W/ H; L! ^+ {7 V
    5.}8 ?. b; j8 b0 d" s4 C5 B

    6 V" H# d; W7 k0 a
    7 j# V6 ?* m0 `7 M9 [时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    6 M& G2 F" @: y. |" a: I5 P$ ]view source
      J9 n- _' @+ E. H8 F- fprint?
    - U1 R9 L3 H1 C" G; q1 w: D2 N( o) f% r2 k/ w( l. C' I. V5 y
    01.<?php) }  i  N* e, H4 U5 j. M. c
    02.function getmicrotime()6 J& u' d( g" T8 `0 e
    03.{
    6 B/ @6 p" w0 D04.    list($usec, $sec) = explode(" ",microtime());
    / K7 J. v- w6 v# {4 U" ~05.    return ((float)$usec + (float)$sec);
    ; [0 y- J3 [4 b+ V: G. ~7 S06.}. F0 g$ j9 t5 K( h1 _0 B
    07.
    4 l0 q. A/ [" p. U08.// 记录开始时间
      f* K8 E  s, N09.$time_start = getmicrotime();* b/ K  B7 d! H( s. B( Y
    10.   o: r& T1 i1 o9 f
    11.// 这里放要执行的PHP代码,如:
    $ X- Y) Y7 }, z% g4 O+ B12.// echo create_password(6);7 N0 ?) P5 m* z( l" d
    13. . q3 {) o( }, K8 J& K5 u
    14.// 记录结束时间
    0 g7 k' @- f% v- P8 @# V15.$time_end = getmicrotime();
    * o& ~* N" J4 T0 ~5 L# ?16.$time = $time_end - $time_start;
    $ x9 }2 v# T6 w+ I17.
    ; |1 V1 I7 r) Y: Q) j7 r18. // 输出运行总时间 + E* Q5 @* Q: H! m1 j
    19.echo "执行时间 $time seconds";8 I  y# N, m& }: J2 B/ A- \7 i( g
    20.?>
    ( ~$ ]6 y# A" `* z; h- v" X8 h) m) G+ I3 r/ ?9 F7 [

    8 u: q4 Y: N8 j+ d最终得出的结果是:/ t/ C. n% @- V4 O* _8 m+ O* f  B
    方法一:9.8943710327148E-5 秒
      O. B8 M* s" h方法二:9.6797943115234E-5 秒
    / O; h5 v! r+ l6 L5 k方法三:0.00017499923706055 秒! K4 ]( W% M# z9 s  [
    方法四:3.4093856811523E-5 秒1 q$ D1 K) K. P. v6 X& C
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。# l9 C8 u/ T: C5 m5 w2 p+ V; @

    & o& F  x5 Z& ?# P
    + R8 Q3 A1 D6 w
    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 11:22 , Processed in 0.431214 second(s), 52 queries .

    回顶部