QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2326|回复: 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,  r/ q1 a7 Z) I' i) r
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #% A, }9 M5 C' @4 k( C+ y
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    # [6 D3 o* F- ?% ~7 m该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。+ r  \8 ^9 E/ V
    view source, y0 k! l  ~7 V" L4 q( O' F. ?" O
    print?
    1 M0 p: Q* l  G$ g1 J
    , w+ r$ V2 v% |* k01.function create_password($pw_length = 8)
    * B  K% R8 }0 U4 P* _# ]02.{+ C* v% l! E: m# p( F
    03.    $randpwd = '';% Q& \& q- y! [) p& e' z4 r
    04.    for ($i = 0; $i < $pw_length; $i++) 9 V: F; P  t5 M- L# z7 a
    05.    {2 }) P6 D2 i6 S# `4 w+ v; A
    06.        $randpwd .= chr(mt_rand(33, 126));- O" S, U( T3 ^# G! K" B% f1 \5 E
    07.    }# @9 c% r+ i6 w
    08.    return $randpwd;1 A$ w- c8 y* n* l! D% u6 c; h
    09.}# K, K9 S# X# M- d( k$ Y6 S
    10.
    4 O% d( m# Z5 P( O: N11.// 调用该函数,传递长度参数$pw_length = 60 v/ r9 ^: y  b+ s
    12.echo create_password(6);0 B. t3 K+ I8 n# Y8 V7 I; A. F5 F

    + u4 B  z3 o( T/ P/ u. y% d8 e  @, t* }/ D& v
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    + `4 Z, w0 }: g4 T  a' G0 ^2、在 $chars 字符串中随机取一个字符
    + F( {5 y6 {# U) G! Y3、重复第二步 n 次,可得长度为 n 的密码5 Y- C4 p0 a: R) X: _+ G9 B
    view source! H' ~/ l- T: E( q8 o! \* N
    print?
    ! `" F' V4 R8 c! ~2 C4 B8 H0 v9 y1 V$ g; C6 i
    01.function generate_password( $length = 8 ) {
      D4 k; _$ T0 B+ e3 N* e02.    // 密码字符集,可任意添加你需要的字符
    5 ?) D# @' N* r& p3 r( y03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';! t6 {4 R) |/ I+ Y' G; ]
    04.
    & Z3 O% w- r+ H1 Y7 o: l2 @, h05.    $password = '';' J4 i2 a- p* Q; H! P& Z
    06.    for ( $i = 0; $i < $length; $i++ )
    : o) S# o2 h7 V5 J5 D; g& ]% u07.    {
    4 w2 k+ R1 l/ w' L: M% R3 n* H08.        // 这里提供两种字符获取方式
    8 d$ p; j9 E; B! F* e09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    $ i4 C: x* `7 e9 c' @) H10.        // 第二种是取字符数组 $chars 的任意元素
    3 N' f  |3 H' D- r/ n- @0 f11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);! ~4 Z: L+ V. M5 g/ z5 \
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];8 B. S- M6 r* d' B! m* _0 [
    13.    }
    9 Q! p: r% P+ x9 f- t: ^14.
    9 x: ?" Y. J$ y( a2 u15.    return $password;) w/ l# t. Y1 [3 L  Z4 ~
    16.}0 R* H/ T4 V3 z) q* I4 U: p$ G

    8 l2 u' V7 U" y
    2 Q0 v9 q% c, F  F3 R方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    ' H; f/ x/ t4 D: @, D9 a& M2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    ; j+ w, w0 ?% n3 m  D3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    6 _' G- {7 g" S% Z8 i/ aview source
    " E5 @8 m  t7 z# H# hprint?' Q! Y- s! `* D( i7 @

    , w. V0 d) U. c" s' H01.function make_password( $length = 8 )
    9 S9 p1 M3 B5 I$ M! a' N! z) Z02.{
    $ @# E; d: O$ m; ]% s1 |5 a6 u03.    // 密码字符集,可任意添加你需要的字符4 V! m# ]7 ^8 q1 D! }" z
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    8 G5 P% A# i5 g/ t, V05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', $ O; p) X6 ^. J8 B$ e9 y
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 0 L) U5 h% q: s5 c5 A# _- ?
    07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    5 G$ g; _) {  F" M- ^: M( K& z08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 7 r$ Z, o. a1 E9 `3 t7 ?
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    9 j1 r3 d$ L$ Q& m# P3 b10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    ; a9 c! m) J8 {& d# R11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    # j* T; _4 M- r3 B! q9 c- ^12.    '.', ';', ':', '/', '?', '|');
    2 x9 `4 N3 F: z) T3 r13.
    ' ?  @5 s* _$ f. f14.    // 在 $chars 中随机取 $length 个数组元素键名
    % O$ v3 T# R  j15.    $keys = array_rand($chars, $length);
    5 X% l3 t. K. U5 K! ~16. * P% P$ o1 S5 _7 i4 ^# d
    17.    $password = '';4 g6 n" O# |% O; A3 C! s0 Q! t
    18.    for($i = 0; $i < $length; $i++)( f  Q0 X0 O) k
    19.    {
    7 d0 ^: N4 W- F3 s20.        // 将 $length 个数组元素连接成字符串; t) _  y( ?( R8 {
    21.        $password .= $chars[$keys[$i]];
    + Z4 T8 e2 k# A8 g+ k22.    }
    & ^0 g+ E% W, d& t23.
    9 Z' f2 [4 D" c# k24.    return $password;. g; T% C# f5 _( C/ H
    25.}4 v. _9 }6 _( `$ Y) r* g8 ^* v

    - B4 c3 ^( C9 m. m) E' G4 G  Q: ]; `2 [7 |
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:- h/ q1 G2 @( S4 L* w+ U4 j. L4 z2 b
    1、time() 获取当前的 Unix 时间戳( |, b/ k" a; I) k" B' Y
    2、将第一步获取的时间戳进行 md5() 加密
    % O0 D- [/ E9 \: |. `$ s- w3、将第二步加密的结果,截取 n 位即得想要的密码9 g4 k. w5 x( B1 N2 R% F2 j
    view source# y4 u/ v; w/ ?6 q: d3 R- {
    print?
      j" K7 m3 z- J& A: s2 s) U) @: M9 G) R
    1.function get_password( $length = 8 ) : M, H3 o+ ^+ `/ p
    2.{1 P1 r  x) K" Y4 t
    3.    $str = substr(md5(time()), 0, 6);0 i% A- u. i& e3 d+ Q8 @7 n
    4.    return $str;: y" Z* K. p& p7 E& O' X
    5.}+ A0 v7 E' N7 W5 s; r- O( o

    5 F( P, l, q- c
    * |% C+ T. U9 i2 ~4 [时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。$ Z/ @( A7 D. m
    view source
    + u2 x* B# _7 K7 r6 A. Qprint?
    ( m1 y" D- y4 |* r2 D0 [  y, x. F+ y% M  Z/ g
    01.<?php
    5 N+ @. g* l  ~02.function getmicrotime(), C: m0 H- c  n
    03.{, K7 _, ]8 I1 |6 h0 U, q+ i1 ?
    04.    list($usec, $sec) = explode(" ",microtime());
    ' U$ @) ?0 q! h$ N6 N05.    return ((float)$usec + (float)$sec);
    ; h- h7 P, q9 e3 t4 z% E06.}
    $ F/ N3 C( ?: V' J9 H7 S/ p07.
    ) _- H. g2 e! B7 n6 `08.// 记录开始时间
    $ t! t% K3 J1 z, s2 ]% Y$ `% P09.$time_start = getmicrotime();" c3 u5 s$ O/ W8 R# _5 L& e% r
    10. 6 B& q* a, N. F$ a( e5 ^+ v
    11.// 这里放要执行的PHP代码,如:8 t7 j: q4 N( h( j- D0 C
    12.// echo create_password(6);
    8 |+ R) u0 I: m- g13. $ D5 _& J% ~) d- w7 D
    14.// 记录结束时间
    . z: ?5 G0 S' S/ W' R: ~  r; G( i15.$time_end = getmicrotime();1 o1 D' @% O* B: K8 M/ q
    16.$time = $time_end - $time_start;9 L( J) X) m2 N+ X' n: I; Z
    17. . }9 S) [. O2 |- @
    18. // 输出运行总时间
    " ?$ [5 d3 g9 j8 w9 U$ S: z. l0 ^19.echo "执行时间 $time seconds";
    8 s7 d8 R, A- @# @* Z5 E2 Q* g20.?>* {* C# E$ K7 z& L2 r
    3 x' I6 j) u4 U; ^* g

    0 q! j8 @# ]  i) A+ y最终得出的结果是:' q# L+ n+ o' t3 _4 b& n8 |% g/ Q
    方法一:9.8943710327148E-5 秒
    # |2 C: }& J+ s; T& _% ], }方法二:9.6797943115234E-5 秒
    0 a! o+ ?+ e9 j7 h; L# ^方法三:0.00017499923706055 秒
    ( ^; t4 X) Y9 a; N方法四:3.4093856811523E-5 秒4 M! T8 ^. N. H
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。. g4 p* k0 ?# N
    5 _& X! B7 E1 O& C# Y9 `( [- J' m; I
    & k' _% F+ V' V
    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-7-13 11:32 , Processed in 0.340029 second(s), 53 queries .

    回顶部