QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2263|回复: 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* `4 M, ?: h+ A
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    1 Q& {; P: X' ^. `0 d6 |6 t3、重复以上 1、2 步骤 n 次,连接成 n 位的密码3 z' D) |3 s% v
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    . s  R) s" N' C( Iview source
    $ t5 ]6 q* G1 I' R: a7 Z) Nprint?
    5 r4 s9 `% Y5 L; ]* G& D8 I  V1 b% @3 N' w/ e$ k
    01.function create_password($pw_length = 8)3 O8 S+ A! G4 O+ y
    02.{7 N2 M4 H/ A- b( k6 X: n1 p- o
    03.    $randpwd = '';+ o0 t5 _; v& [7 |6 z) K
    04.    for ($i = 0; $i < $pw_length; $i++)
    ) A7 n* U' l) M9 n! Q/ v- z05.    {
    1 B7 L* C. Z/ j! P! D5 ^) {06.        $randpwd .= chr(mt_rand(33, 126));9 S5 E$ y6 g% L$ n  M: `
    07.    }
    ' H7 H. U4 }3 z7 w- {5 I. Y08.    return $randpwd;
    $ j8 X+ D0 R% j8 w09.}
    " `: I& O# D5 a% m8 v( t$ J* o, q10.
    5 E! F- ~- q/ a- d/ G3 @11.// 调用该函数,传递长度参数$pw_length = 6
    7 s* r9 G" }+ y12.echo create_password(6);
    9 w7 K7 u. @* y0 l! |# N- [( r3 C
    1 Y9 z3 \. ~$ j* V9 }0 [* i% D, ^1 r# C# s
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符- J$ x* d1 G: a0 I5 ^5 `/ t
    2、在 $chars 字符串中随机取一个字符
    6 f/ ^' R  k' m3、重复第二步 n 次,可得长度为 n 的密码
    6 t' a2 j& j5 s6 ~  W5 @8 f* xview source' i( ~+ B. |# i! n! s- I( x
    print?
    # N4 Y5 _7 p3 d$ Y& Q- t8 P4 g2 s5 K0 ?* j7 R
    01.function generate_password( $length = 8 ) {
    2 e: [# `; V" }) M* P. f02.    // 密码字符集,可任意添加你需要的字符$ K3 t/ g) E  H
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';+ X) C! M1 E4 B1 A2 z& i
    04. : ~9 |& f$ C" `6 n6 |% t: F! d
    05.    $password = '';8 A& B. k8 b3 o8 h
    06.    for ( $i = 0; $i < $length; $i++ )
    * u5 G$ J; t$ H07.    {
    ; y6 m* P$ c) B2 q) h0 e2 {# N08.        // 这里提供两种字符获取方式
    ' s. R. v9 [" ~# ^# S8 y  F09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    ; q7 Z! O( _* k- H10.        // 第二种是取字符数组 $chars 的任意元素; y9 f4 {6 \) V3 Q
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    $ y: \4 X/ k( `* {8 u12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];3 r1 Y5 F' v. u; d* e
    13.    }
    1 l( X9 S6 S, B: O& v14. 0 H: J/ {' Y/ P6 z$ N
    15.    return $password;  z! k6 n. q* \* W
    16.}
    * I. {, b- @( p. \4 p/ a
    $ s6 s) u* D: X( D. q
    * l9 u8 t+ }  X% w0 n+ O1 w方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符# ~" [, n1 s8 b
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素3 X3 G' `! }! D" }# x$ G$ X5 _
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    9 q2 S9 H3 I2 C) O8 D6 R& Wview source
    ' i: ?1 W8 i  V( g) _print?
    2 V  N% G9 R3 E. |& w
    4 \  m) g. M: M* L$ D* D$ A01.function make_password( $length = 8 )4 m6 E6 I$ w7 Z3 D4 J3 ^
    02.{) Z, L8 t' V, \  N! Q5 @! x
    03.    // 密码字符集,可任意添加你需要的字符
    & H4 M8 T$ U/ T1 h: s, }5 c- r. S1 h04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', * N" B5 K) c- X4 I4 U! F- w0 \( _3 R
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 7 g! ~  `# H2 Q2 v; H! {; \
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    - B2 Z9 q' [3 i5 ~( b07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    4 {4 h# _' V( q! ^& i5 G' c, b: O08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    1 e6 x, M- s$ t1 r- f" i09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    7 Z/ v4 p1 k; g+ [10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', 2 N( j5 c  F3 m3 p4 H
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', 3 B) ]: d# |7 Z  P
    12.    '.', ';', ':', '/', '?', '|');
    ! p" I# Q$ ^- E  e13.
    4 |( a% j6 G6 F* n3 L0 {6 q2 L14.    // 在 $chars 中随机取 $length 个数组元素键名
    . l0 N0 ]* h& Q' \( b0 Y0 [2 M5 u15.    $keys = array_rand($chars, $length); 1 U. S  U0 p/ H# m* M
    16.
    8 S0 s+ \0 u& l0 k  m. |5 _1 ~17.    $password = '';) l" [; L5 R! n" U
    18.    for($i = 0; $i < $length; $i++)
    * Q0 q! s* I' ^1 R1 q& Q19.    {6 @+ A" N+ L& E" c: B0 ?- g4 z+ w$ [
    20.        // 将 $length 个数组元素连接成字符串$ p2 L- h' m$ B* C' Y9 p
    21.        $password .= $chars[$keys[$i]];
    * k% ^9 [) L' \2 X+ ~' x' @22.    }! Y4 z( I- Y9 m; o' j1 T
    23. ( k' y$ W2 [$ P5 c' @
    24.    return $password;
    ' B* O8 t; J; ~, P' i25.}7 E5 }. I3 r  E5 O4 Q  M) @  a/ X1 a

    : U+ N# o; w1 [0 L
    9 o/ C) R7 b" `- }) C% z方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    5 _1 K# a) f( {% L1、time() 获取当前的 Unix 时间戳
    : ~1 N9 P7 Y- I+ O2、将第一步获取的时间戳进行 md5() 加密
    ) ~3 g1 T) k! n% t: |/ x$ e3、将第二步加密的结果,截取 n 位即得想要的密码
    ( L3 |1 f0 O# w" _3 h7 mview source; N! t' U2 }7 s8 x! N9 }
    print?% A5 G( a6 B, c/ z( Y

    0 S# U. Q* _$ l& w, @" ?1.function get_password( $length = 8 ) & N8 \% S1 P) t0 d; i- f# j+ m0 u2 m
    2.{2 p6 m* h( I6 N1 p) y% j
    3.    $str = substr(md5(time()), 0, 6);4 l( |3 z7 D* V, d$ L8 p" f5 M
    4.    return $str;# m' M% K/ i- T1 s: q: Y( R
    5.}( w" B; K1 Q6 }7 g) z1 `) Y1 }
    ! o/ J( V7 t3 y
    % m  f1 V; l9 j6 ~0 F* q) u
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。  ?% w1 Z8 [' d% i
    view source
    / O  z0 t( C0 a. q4 s9 |print?
    $ M$ H/ h; |1 r* c0 U$ i
    * m2 _& N- W; |$ [01.<?php
    ) q0 ]9 b9 }/ B& J& a9 N02.function getmicrotime()
    $ G5 B+ C! A- n- L) s# s" s- {/ U; p4 o  F03.{" G4 f5 C- K, X+ h* }
    04.    list($usec, $sec) = explode(" ",microtime());
    3 @1 w0 J  q1 z/ G. g05.    return ((float)$usec + (float)$sec);% x& i6 p) J% F3 ]' J8 z7 P1 H
    06.}" l' ]3 p, s! a
    07. " S2 \( e4 l, X' E7 s% ~
    08.// 记录开始时间0 i- k$ {6 e% }6 D% G8 D# d& C5 w& R
    09.$time_start = getmicrotime();* `" Z* U% o0 B3 g5 h
    10. / Q3 g% D2 W5 n) _8 s
    11.// 这里放要执行的PHP代码,如:, x3 i* Y4 v  N: L1 b- t2 T, I
    12.// echo create_password(6);
    4 v1 }% o7 a0 }3 ]; u13. " S" |4 P) y9 _; V& y
    14.// 记录结束时间
    . V7 }8 u3 {, V4 _. O- `15.$time_end = getmicrotime();; O% s4 w# {# k. R4 }. l
    16.$time = $time_end - $time_start;% M# U! o) v* V3 U/ Q2 U& Q
    17.
    8 e6 p6 b8 T& `! o18. // 输出运行总时间 ( ~7 i; U/ T5 I
    19.echo "执行时间 $time seconds";
    ' C, r: x& I0 k& a# L3 r7 k$ G20.?>% d; P+ i: T- n: g! h/ c$ J% ~% [

    , c% w8 l8 W( R7 g# O( l
    ( s1 ]/ _, K$ x% M' a& ~  e4 I' T5 v! r最终得出的结果是:' o* \5 ~9 ?2 S) Q. z6 \
    方法一:9.8943710327148E-5 秒0 a- ^6 E5 ~  r" J2 W1 t
    方法二:9.6797943115234E-5 秒
    2 j( a4 P9 T* }3 O2 o. c3 k方法三:0.00017499923706055 秒
    $ ]2 I8 _1 [: B6 {+ ?! V方法四:3.4093856811523E-5 秒5 ^; v- M# Q0 p* m) [" W: t' o/ t
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    3 e# n( [4 u: i9 m/ ]  K0 o
    4 `2 v$ r2 S" K% ^, |
    ' j, ]" S1 W+ x. g3 Q
    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-10 12:34 , Processed in 0.501730 second(s), 53 queries .

    回顶部