QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2010|回复: 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,+ ]8 ]2 j9 _8 p" R
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #! U/ _* p  W$ s+ d0 Z* W$ z% X6 b
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    8 I7 m/ k& ~: ^( t该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    , {5 ^' ~2 K& Lview source
    2 K+ n7 z8 g* l$ Zprint?
    & O3 `) c* k" U7 Z# y: N) p7 u" _* \. ?5 |( Q$ K) h
    01.function create_password($pw_length = 8)6 D; e8 r  m. [+ X3 _
    02.{$ ]8 j4 @  I7 b+ n
    03.    $randpwd = '';. v% P' A+ X! K, v
    04.    for ($i = 0; $i < $pw_length; $i++) 2 V6 A. s, U3 \$ Q4 F( ^% m( j
    05.    {
    7 w+ g$ ?8 C, w+ o06.        $randpwd .= chr(mt_rand(33, 126));$ Q* e$ ?8 B" s9 m  Q2 e' B7 }
    07.    }
    3 W+ A# m- X+ _08.    return $randpwd;% r$ J* _1 Y  S5 Y3 W
    09.}. x& `/ k% \5 `; b! C7 C
    10. 2 Z# w* ^: G) z" b# ]) x
    11.// 调用该函数,传递长度参数$pw_length = 6$ D, I- X$ i9 m! f, s. Y# G+ S
    12.echo create_password(6);& Z3 c" O  V  k2 l; v

    . L$ s! _( V  M% j- R& N
    & ~8 F* ~8 v- Z+ t方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    1 @' g/ A1 L, X  J) k( [2、在 $chars 字符串中随机取一个字符
    $ A) s( [) @* U2 L6 @0 J3、重复第二步 n 次,可得长度为 n 的密码& U3 z+ C5 a* ?. s
    view source2 s" c( b9 q% t. m: ^
    print?9 b2 Y, g* n6 |, i  ^

    ' j- x; @- l4 m5 A: G: q01.function generate_password( $length = 8 ) {1 s; a$ r6 v/ h+ c7 [8 E9 D* b. z- q& T
    02.    // 密码字符集,可任意添加你需要的字符
    4 t! e5 L) u5 x4 V0 D2 }  t03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';+ w2 B2 d$ V" t0 K4 _' H
    04. ; ]0 q8 n7 `* u) w' @/ z2 @/ v" V
    05.    $password = '';
    % L' b  F- h4 a: |/ M/ ~06.    for ( $i = 0; $i < $length; $i++ ) * Y" c) E% ^3 G, d. p! h# r% n: z
    07.    {6 ^8 r! n% S/ x, P
    08.        // 这里提供两种字符获取方式& Q- b5 w* ~# A0 U' n
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    1 D2 K& x5 ~( ]10.        // 第二种是取字符数组 $chars 的任意元素
    " S9 l/ @# c" Q! T' ]5 N! x% R: m11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    # N) _7 @0 v1 Y1 R) A12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
      a- A  R7 q; n( O3 \/ o13.    }
    , ^/ T" s1 k0 ?3 Z( N. g8 V( \7 r1 B14. - v: R2 E7 X- ]. E
    15.    return $password;& [( R2 ?" f. ]# c- ]: p
    16.}
    % [; s* P; s0 p  p5 q  w
    6 X5 j( g$ d4 N' W7 {) d
    , n2 q: l% a2 j& L$ ^, g方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符2 S8 q9 `* L3 @9 G
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素0 [* R# r4 X+ s/ n8 e* h( A. L/ m- `" m6 e
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    % I1 f) t7 [3 d! Q( j/ h" x' Dview source
    0 Q" C+ P& i' E5 ?! oprint?, P1 I7 e% a; [8 j/ m
    * K, P2 s9 M% X: T* m
    01.function make_password( $length = 8 )/ c" k# n; U7 A4 w
    02.{# N' s: y* Q6 j4 n; E1 t; v
    03.    // 密码字符集,可任意添加你需要的字符
    3 R0 L. K" O1 X) P1 m$ Z04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', " {/ l, n0 C+ E) ~; a
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    1 n0 G+ N7 w+ y! y* a06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    6 m$ o6 p7 e0 I+ ^% D: l% K07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', . f0 r2 J  U/ _9 G" ~3 ]1 c! T
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', $ q' s/ M/ ~) r1 X
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', 4 |* j* [! X- C$ f
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    ' q& b( V, m& K: L# e" F6 r& h11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', & S7 X& e1 `4 @$ F! n* k
    12.    '.', ';', ':', '/', '?', '|');$ e3 d1 b- R3 n" l" I- P
    13.
    ) X+ Z8 f9 l9 j. T7 B14.    // 在 $chars 中随机取 $length 个数组元素键名
    1 V0 N5 K0 |+ ?  O15.    $keys = array_rand($chars, $length);
    7 E' ~4 e8 s: V2 V6 R0 X  `16.
    4 C+ w0 {7 c1 q/ A& R( K) g17.    $password = '';9 u0 t7 q- Y6 D
    18.    for($i = 0; $i < $length; $i++)
    " B# @( T. e! K0 S19.    {8 }6 P2 w! i4 G( C
    20.        // 将 $length 个数组元素连接成字符串
    - F$ `, z3 w7 }' X! s( {5 B! C+ Q- ~5 i4 Y21.        $password .= $chars[$keys[$i]];  j  b! k4 `7 t3 b( I4 H
    22.    }- o- K" I- f9 j$ ?
    23. 6 s: ]0 ^6 ~5 t  f$ t) V  p; h: ?
    24.    return $password;* z+ z0 ~6 g5 ]$ Z1 D. H" h
    25.}
    8 R9 t: _8 Y/ y/ q! F$ ?: ~: k
    " Z0 U6 P& k- c! s/ m' B. K$ a4 M5 }: S* B
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:! V" n8 l$ N# }, J( `
    1、time() 获取当前的 Unix 时间戳0 o7 R; P/ Q, F0 L* O- m
    2、将第一步获取的时间戳进行 md5() 加密( g' H1 f( C# @/ F  K; b
    3、将第二步加密的结果,截取 n 位即得想要的密码
    1 [6 w& R1 }! n# Zview source
    9 p  [& p: E( v& @. I; oprint?5 R9 g3 `" Z1 b9 J

    ! Y4 u; \) A* Z6 I$ N8 s1.function get_password( $length = 8 )
    7 E) ]; i9 u3 S$ b6 r& u2.{+ X1 Q; Q8 @. `& I; \
    3.    $str = substr(md5(time()), 0, 6);
    5 x1 p0 q6 h) N- }4.    return $str;( f+ v/ a+ c7 Y/ k
    5.}
    ' N' E# e$ k6 d/ @1 L+ r# n
    ) {) `6 Y- U7 {" Q5 C9 s, {& {# E7 S
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    * X7 X3 x& ]& o! F, r, u! J+ Nview source
    % L+ x  _3 d4 n) c, D7 wprint?0 o% m5 P7 u1 t
    ; p3 z- `" h( Q0 p- `
    01.<?php
    % G. P/ a& X4 I' ]02.function getmicrotime()
    " \8 f/ h3 A0 i4 k! Q% e2 u; L" {03.{" a; ]1 e5 T. x* N7 p2 x
    04.    list($usec, $sec) = explode(" ",microtime());. [- [* Z9 D4 G  _) N0 S  h
    05.    return ((float)$usec + (float)$sec);
    ( F0 F4 @* n" P9 P1 N06.}  \) t0 I! f4 H0 l3 ~3 W2 L+ @
    07.
    " ~# b8 }8 b' z; e# f9 {08.// 记录开始时间
    & T/ r4 ~! m# @7 @" I. U9 _09.$time_start = getmicrotime();. H/ H2 \* ~1 [
    10.
    ; z  R' X: e# r8 {: e9 d11.// 这里放要执行的PHP代码,如:/ P. w1 K, C$ C) ^9 e9 v% D
    12.// echo create_password(6);
    ) h4 I- w. e3 _6 }$ A2 l+ j' z- Q% Q7 y13.
    # ^* x# N2 k7 ]; y* A- e14.// 记录结束时间
    1 l, t4 E- |/ @15.$time_end = getmicrotime();
    & B$ u$ K  @+ l! z  v. L+ y8 d16.$time = $time_end - $time_start;
    4 R4 U! G- g3 a) i9 y17.
    5 ?( m# s9 V# v' h  I18. // 输出运行总时间 . y1 s# f9 s% ?* I
    19.echo "执行时间 $time seconds";& f1 I% v7 ?, ]1 k
    20.?>9 u  j/ S% R" t0 R0 p

    2 g% Y3 f! _' S* I& Q' x& q$ j8 u; N* E8 R( o
    最终得出的结果是:
    9 m( G- p' Z8 d0 s方法一:9.8943710327148E-5 秒
    $ {- p% a, V1 P( @, d9 H7 V  G5 c方法二:9.6797943115234E-5 秒
    : q+ o. b1 a( Y1 A1 ]7 k" z方法三:0.00017499923706055 秒" U3 u6 d- I5 ?) r' p0 W; ~
    方法四:3.4093856811523E-5 秒
    / K8 o; B. r4 |( F可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    + ^: t, t+ I4 l4 S1 I
    + f2 J9 d' J9 M* y8 F5 R$ j9 L4 e, j' k) B0 g3 e& `! H, D# 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-8-17 09:42 , Processed in 0.577511 second(s), 55 queries .

    回顶部