QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2272|回复: 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,* t, _/ `7 n: _1 N. J: S
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #6 _$ X- X0 f! J3 t
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码" w3 G5 L/ M* F: a- q
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    & N; t& {( ?& j. c$ ]2 Mview source
    4 l9 c$ X4 }- H- v* Cprint?: L! }! G/ E& F

    + T0 j% N9 Z% ~% R4 E/ s01.function create_password($pw_length = 8)
    / Z# N% z3 X8 ]5 \02.{
    8 @8 {5 W: q* l/ M& ]! d. b5 A03.    $randpwd = '';& y( V8 ^: o; h
    04.    for ($i = 0; $i < $pw_length; $i++) 7 h$ x+ E) H. f
    05.    {
    ( Y  }) B$ c$ D& A* U# s: e06.        $randpwd .= chr(mt_rand(33, 126));
    ; ~$ m% p1 u7 h" F5 o: j: y2 C07.    }
    7 P% f" A% m( G& c# J! Z2 D- `: f08.    return $randpwd;1 q2 q/ a* T3 s
    09.}
    * q* h; m" e" X. O5 x* W; L/ Q10. . U2 _" r# j: D
    11.// 调用该函数,传递长度参数$pw_length = 6
    : k5 |+ K; F, _% w9 ~/ H  |9 h12.echo create_password(6);
    1 q  U8 C8 F1 h# x8 N: `. W4 S+ Y" `8 [: X" |/ W% @. }
      J* I; D* d8 J0 `8 [, O
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符7 K1 b  Y: x. X* r/ ?& _
    2、在 $chars 字符串中随机取一个字符
    ( h/ ^( k, z3 N: z" n3、重复第二步 n 次,可得长度为 n 的密码3 X! s3 o& ?) S6 F
    view source: h3 T: x9 ]  s; N+ K: c
    print?+ k' W6 F. G1 M* x& m, L5 Q* c8 z! a

    3 v5 @1 N& e+ @. \8 j01.function generate_password( $length = 8 ) {
    ( l0 j; \  `, r1 D) m3 Z02.    // 密码字符集,可任意添加你需要的字符
    ; L' u2 E) S% W6 q- ?/ j03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';) u+ F$ T6 x/ b. B+ B4 q+ d- D5 f
    04. : L# [- V. j9 f, S
    05.    $password = '';
    ( N1 V3 B' W& j4 R5 l06.    for ( $i = 0; $i < $length; $i++ )
    & ]6 R6 N# p  A, V07.    {; p  p/ i+ v6 X, j  L% R
    08.        // 这里提供两种字符获取方式) b& \! x9 o0 h: E, j3 K3 u9 Q
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    $ O. Q$ P% M& U- F( ]10.        // 第二种是取字符数组 $chars 的任意元素5 p) M7 a7 A* K- q
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);, d4 T. q" }  K2 x
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];* ^3 S# U$ L8 \. Q; ]( v
    13.    }
    ) ~5 ^% C# ?- }8 j14.
    7 u; |% D9 `; Q7 g15.    return $password;
    ! y& k8 N9 K0 w" w7 d16.}+ b2 {. t+ }+ `! i' K
    / \; F6 P6 v8 @) T% U* L
    ! t  j) ^2 I4 O. o/ R* S
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符4 X" C2 W" M4 d5 W0 c
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素& Q7 {+ T9 j6 q4 a$ ^
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。! [* `+ v5 K5 v1 a- z
    view source
    - z( A: u" ~0 o, I1 a: D0 pprint?
    8 S, u. \. N0 X- B2 B' |* d! O5 L% f1 \7 a0 i5 V2 n: Q- w% l. |% C
    01.function make_password( $length = 8 )
    9 Q) Z' d6 ]# O) i  b# t4 `4 @+ y02.{) ?# |( w5 u- W6 l
    03.    // 密码字符集,可任意添加你需要的字符
    ) Q% {- ]7 q$ J+ o04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 5 {1 ~# P  A& k# I# M2 r) V! B. w" s
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 8 a, J% g; a  `) o' c, Y- N
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 5 b4 q1 ^; R& B6 c0 X
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 0 ?* P; i% e! U
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 9 d. \3 H/ H; E1 r# b& A
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', / b* I: E+ S# X9 c1 D7 l, y
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', % n: a9 x6 M0 D3 u8 Q% _1 s
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    . Q) s6 ]1 A! j12.    '.', ';', ':', '/', '?', '|');
    & t6 }$ ]/ v$ ]" u: B" E7 }6 a9 E13. 9 o- v  ^9 k% V, H+ \7 c
    14.    // 在 $chars 中随机取 $length 个数组元素键名# w! U7 g$ ~" @6 M7 `- R
    15.    $keys = array_rand($chars, $length);
    ; t, s* @5 ^% ], Y$ }: x1 D16.
    2 }( T1 x6 ~. r" z) y* Q8 v17.    $password = '';5 V9 c1 G4 [/ X1 X# I/ d$ x
    18.    for($i = 0; $i < $length; $i++)* }7 c% r; v6 j9 C4 ]/ A6 P2 |
    19.    {) G  g2 _: `7 B7 ~* H& m
    20.        // 将 $length 个数组元素连接成字符串
    5 X- _; S& X- ]5 O$ P! n, V1 D21.        $password .= $chars[$keys[$i]];4 v: G% y! a. i2 h+ y1 K. ~" F5 B- O
    22.    }
    + {8 A) k7 Z0 w, Y23.   K$ J/ E/ J1 Z  A. K( X3 ~
    24.    return $password;7 V; ]5 U8 c! o
    25.}
    " ^5 n! {4 X7 Y  M% M* T" f4 t, I2 v5 |2 ~+ f8 W& g6 D
    & E# r+ q) [: D9 h) D. n. }
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:4 t% t. C0 ~. U  K+ f8 ]
    1、time() 获取当前的 Unix 时间戳
    " r1 }. N4 ^' V, a2、将第一步获取的时间戳进行 md5() 加密
    ; y) m+ {% |9 S3、将第二步加密的结果,截取 n 位即得想要的密码; A1 u; e! P$ m* h6 A
    view source
    7 T% K1 C1 p& B9 ]6 \1 l) Dprint?
    ! p' S1 l' \, w4 B3 p: i8 Y
    / i) C6 D- g# i4 k3 O1.function get_password( $length = 8 )
    5 H; d5 |" |" T2.{% U0 k' V& s! F4 d/ n
    3.    $str = substr(md5(time()), 0, 6);
    " Z# V* g. a0 t- [& {4.    return $str;
    4 E9 S) v# r# L) q6 M5 L5.}" R. c9 g8 ]9 |3 ~0 J+ i

    $ Q7 s0 Q5 ~8 r  y! p: P# j9 V. V. S5 \3 t* W1 e" T
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。( N- {( t5 _$ W% L: _: L% E
    view source
    0 q) J# I1 o9 w7 V! @7 }print?
    3 ], `7 k' B* [# G
    ' |. Q) Z  l! |. W+ N& v01.<?php
    9 x1 e0 h* G6 o0 Q: V02.function getmicrotime()
    ! H4 _, ?- Q  V03.{
    5 y1 L$ t3 ^' ]9 Q04.    list($usec, $sec) = explode(" ",microtime());
    3 \/ F# O. L0 J* F, `05.    return ((float)$usec + (float)$sec);2 N. z; ~, K" G! R3 k: X
    06.}/ `* g9 ?+ H- N9 M: J7 G; T9 ^
    07.   F, x) O8 \# F. s/ S: @% u3 x
    08.// 记录开始时间
    ) g& \7 x# ]* W! ~09.$time_start = getmicrotime();
    8 u# r2 o* N; c1 Q% \7 \10.
    6 @* I8 K- B4 ~, Z11.// 这里放要执行的PHP代码,如:9 J7 T7 `' [8 ?; H$ r: [* W
    12.// echo create_password(6);# Q5 B  N0 ~% e8 ]4 z
    13.
    8 C" A, ~9 J! @( b8 Z/ f. E0 V14.// 记录结束时间
    ) m! V' s! X9 k, _15.$time_end = getmicrotime();% B9 y3 N- h7 g
    16.$time = $time_end - $time_start;
    - m+ ~$ X$ W0 l) e( K( U( ?17. 4 z! [& ?1 e6 E. R+ r/ d4 y$ n! w2 N
    18. // 输出运行总时间 8 [+ u- P) c; l: [
    19.echo "执行时间 $time seconds";
    9 D* [/ ^: r2 H" i+ w4 p3 Y/ c( A20.?>
    , a, A* ^; F( V$ p
    & B( r# H4 s8 C3 v9 A3 y. m( A; I7 |+ U3 i$ {
    最终得出的结果是:
    . k# l  X# x7 k: `8 K/ y: O1 f方法一:9.8943710327148E-5 秒8 L" d0 a% F8 \! X. V
    方法二:9.6797943115234E-5 秒
    2 ~- Q2 O6 h; ?7 s' W8 ^; p方法三:0.00017499923706055 秒( z* I' g( b7 w3 b. Z
    方法四:3.4093856811523E-5 秒4 L1 x2 H) v# ?
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。% T4 e  J2 {7 O5 \; L

    % k' Q# {% l1 H1 @! k# Y
    & c: |. {! D! G4 J
    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-13 15:52 , Processed in 0.409624 second(s), 53 queries .

    回顶部