QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2274|回复: 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," P! s5 v( d: S) x+ ?: m
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #8 M" ?5 T. \  S# N, c4 T+ W2 w) f
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码" f6 y& l8 v5 b7 q5 ^
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    ( Y. t- I8 B* m* Y6 d9 e, q( tview source
    ) Z8 x5 Y4 \, W$ \print?
    0 y) j8 k6 |* m  ]) ~
    , U& Y- P1 j' z01.function create_password($pw_length = 8)
    9 D/ O/ m. s5 ~2 m02.{
    3 [% p* f. E8 J03.    $randpwd = '';, o! K& a1 M* G& N! {2 b
    04.    for ($i = 0; $i < $pw_length; $i++) 9 F% L* ~5 ^8 b$ S' v* g# k
    05.    {
    + c* q, ]6 N3 ?06.        $randpwd .= chr(mt_rand(33, 126));* b2 [) h& J4 a7 y
    07.    }
    . }  @! o. N" b, N4 r08.    return $randpwd;* D9 b& O2 L* g9 h& ]
    09.}
    * c6 h( l  C" j( V10. $ B' D" d5 x4 J. `
    11.// 调用该函数,传递长度参数$pw_length = 6
    $ ]. a& }5 F, m# \12.echo create_password(6);
    . _. m% i8 @* C9 z! ^5 D! h2 }, o0 a. d( o  s( a0 B5 U* A* W8 v& X
    % ?- N; d2 F( p1 W8 r
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符, ^& I* W4 F+ ~0 R1 z0 u$ F
    2、在 $chars 字符串中随机取一个字符: c2 w2 V! a& d  s3 a
    3、重复第二步 n 次,可得长度为 n 的密码' h6 x$ U* e8 t7 U( j8 [
    view source
      M" W) f2 q0 A$ ~$ T5 V% n6 @print?$ U$ ?4 H6 \, e3 R# R

    ' }$ K2 w/ _5 Z- D6 w01.function generate_password( $length = 8 ) {
    , h6 N1 D2 D+ s02.    // 密码字符集,可任意添加你需要的字符
    0 f0 w5 |# n& c8 J- \03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';$ g# \* G, \8 B% j6 J  C1 ~
    04.
    0 w/ E& G; o1 P1 [05.    $password = '';0 R. C4 |: P4 o3 K# h
    06.    for ( $i = 0; $i < $length; $i++ )   s( L$ g: g0 I* T: }
    07.    {  K0 p9 S% b9 S" {8 D
    08.        // 这里提供两种字符获取方式
    - S; p  M, E* J+ K! {* ?* d2 x09.        // 第一种是使用 substr 截取$chars中的任意一位字符;& n3 K9 `; l# N
    10.        // 第二种是取字符数组 $chars 的任意元素
    * U6 S1 m2 _0 E# T11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
      B7 W4 E0 P6 Y9 H( ~+ r12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    . @: E& C' c4 i) B% R1 m13.    }6 b( K& ^- [$ _
    14. ! J7 ]+ l1 j6 @  L
    15.    return $password;3 P0 b# a2 y2 x, B- l: q1 \& ?& `
    16.}5 d( J3 a8 u+ o* Q
    5 j* t2 W6 @1 x, B8 H

    4 @9 t! K8 b0 J6 X2 {方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符' r. P7 l5 V; E" g: Q! ^8 ]
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    % W" r* H/ M& z3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。9 g9 N6 i0 C4 h1 ?8 O  u$ B
    view source* u9 o6 r7 ?4 S2 t# I
    print?5 n2 ^& D+ o6 M& j; Q
    % m3 x+ I; `0 F) k
    01.function make_password( $length = 8 )
    ! T4 u8 B; v: a) D02.{* b8 u$ l" Q4 B5 G) l6 ^" P" S% N: M
    03.    // 密码字符集,可任意添加你需要的字符
    & @5 f  E- N% A0 L* w04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', - ~: }# Z8 T$ a, [1 W
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    1 N: x* n2 j) b  j& n2 V06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    + H! I" I+ ~5 u07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    5 q8 }/ Y3 `7 E1 N! d08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    4 k! H1 V5 K2 a  ?09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    1 w) J1 J2 m  ~( D/ q% P10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    8 R' a: }! {$ ~! n! g( X- u9 B. D11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', ) r# j+ T, j( ?5 u) W% e4 q
    12.    '.', ';', ':', '/', '?', '|');' m* A1 K) R. o* ~! p9 @6 t9 ~1 [
    13.
      E+ n8 ?3 S" E3 t( R: B- w* W0 t14.    // 在 $chars 中随机取 $length 个数组元素键名% X- X7 V/ E& Z
    15.    $keys = array_rand($chars, $length);
    ; N* H1 B6 T0 X# |' i- q16. 2 g; d( v. [4 j. D; }
    17.    $password = '';# H" p4 O$ m* c+ G2 h( W% G
    18.    for($i = 0; $i < $length; $i++)
    8 U3 G, \4 `4 ^& @1 K9 x8 Q0 o" u19.    {
    4 r& B( L' D9 w2 m7 `20.        // 将 $length 个数组元素连接成字符串
    # {5 E) m+ O1 [; W21.        $password .= $chars[$keys[$i]];
    ! f7 g3 @' a6 B22.    }2 K7 s$ D/ B, ^" l
    23. 8 }0 n% L- u; r+ w- o
    24.    return $password;
    2 w7 K# k2 H/ N. \" F1 q25.}
    2 u( q0 g" e2 p
    # q0 P7 R% L! `* k+ E( e# {. a, D5 }& ^$ j  c
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:3 ?- Z, ]$ d$ f0 P1 Z+ i
    1、time() 获取当前的 Unix 时间戳
    ! }) F& l- v9 u2、将第一步获取的时间戳进行 md5() 加密  A: Y* V) u; }: F
    3、将第二步加密的结果,截取 n 位即得想要的密码
    ( C, @  k6 L" {+ J0 vview source
    - g/ Q* h; N1 U. tprint?
    5 o* W7 F  E, n! v5 j& q2 O5 Z5 ^4 Y  V& e
    1.function get_password( $length = 8 )
    1 \  y! N& m" \7 b" H( U* E  L- W2.{  l6 e* f7 G/ j1 y, l7 ?) r
    3.    $str = substr(md5(time()), 0, 6);
    % n; U. A' q/ n+ c4.    return $str;1 l! p; `; I# x1 m4 Z7 {2 N
    5.}: ^: N, Z* Y4 \& }" {, h& C2 n3 b
    9 j+ K4 o. v5 d4 z$ ~) l. z
    , r5 I8 K5 y2 m# P+ r2 N7 N
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。. _+ @0 a7 }3 @# e/ y$ M  u' n' n! I
    view source
    4 k: H2 S/ b! K7 l' c: rprint?" t7 u- D  o2 W  D7 h% D2 ^' x
    2 L4 H- ^+ {' E9 M
    01.<?php
    , w& @, M5 L/ w9 n" I6 E02.function getmicrotime()6 V4 O& i7 V& _; n
    03.{
    0 F  S" {& n+ b/ h$ b( B" I  N04.    list($usec, $sec) = explode(" ",microtime());/ K# x! @2 l1 v8 T4 r! F( i
    05.    return ((float)$usec + (float)$sec);
    $ A: J. t% e+ |' L+ ^0 `' _  p06.}% T. E7 n, a3 F7 E' w. O
    07.
    , F4 ~4 B' D9 j! o" b, e08.// 记录开始时间3 M0 F( ^1 R2 |' Q
    09.$time_start = getmicrotime();, Y" O4 Z1 M% Y2 d3 y
    10. , I0 D6 Z; F* v0 D4 ^
    11.// 这里放要执行的PHP代码,如:
    $ m: j+ K7 u% G9 f  o" x- |12.// echo create_password(6);9 s" o0 y% x( D/ F, E1 a  T5 h
    13. ; F7 X# q8 [1 r8 o) v! g# C! F
    14.// 记录结束时间  T, ^3 ~9 g" a3 M( H; }' T
    15.$time_end = getmicrotime();# p' D6 s& y2 x, g$ y1 o' {
    16.$time = $time_end - $time_start;
    0 z& A- X# H3 o# X6 g4 p& u" w3 |17.
    ; s+ d! g0 L0 v/ E4 v  k1 o18. // 输出运行总时间
    9 u, }. [* {5 M" `+ e# {19.echo "执行时间 $time seconds";
    1 r1 X5 U  m; X, p) G) \20.?>
    3 u( G7 q1 I" @) l* u; @  v" L1 w9 c3 C/ q" h, Z8 R* W
      y8 t7 b+ M! f6 L/ ~: R( c
    最终得出的结果是:2 ^3 D6 I* X4 B8 a
    方法一:9.8943710327148E-5 秒
    ) H) Q( D3 O! r+ o. _方法二:9.6797943115234E-5 秒
    % e- l8 G! s; I方法三:0.00017499923706055 秒
    % f) f4 `$ o5 ?$ C' R方法四:3.4093856811523E-5 秒
    * F0 i1 b6 }% [2 ]可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。4 z' i3 h/ _: L# a( V% ]  k

    9 k& m* l9 K! p( m* f9 j; |* L9 C3 v* E" I& p! e+ p+ b9 F) Z' z+ L
    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-16 11:50 , Processed in 0.422745 second(s), 53 queries .

    回顶部