QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2275|回复: 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,
    3 z6 s- Q7 |+ u9 I2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    $ |) O/ w* n+ T8 [7 |! B3、重复以上 1、2 步骤 n 次,连接成 n 位的密码' ^) T+ F6 _. v! P
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    : l4 k: o" j5 l  _4 \view source) B( ?. W: c2 H# Z" A
    print?
    / A9 ]7 t+ b, e. H
    : M3 C0 M% o$ n4 r, T8 `9 [01.function create_password($pw_length = 8)+ `1 `0 ]0 p* ~& m
    02.{
    - \, b5 i, R" p; ?4 n03.    $randpwd = '';
    " H, B- ]3 X) t% N04.    for ($i = 0; $i < $pw_length; $i++) - R4 W0 P2 J( Q" b! q
    05.    {
    5 t2 W5 n& m3 K06.        $randpwd .= chr(mt_rand(33, 126));
    ( l; Q- L) b5 c) I( [- X* r+ \: ^07.    }
    : E; c; j# n& L* v7 S( j2 k08.    return $randpwd;
    8 p, f: b- ?1 |2 j( m5 y, F09.}: S9 b. {# D; u, R0 V
    10. : A6 \6 }$ T2 P( p1 @! n1 s4 X
    11.// 调用该函数,传递长度参数$pw_length = 6
    ( |8 V6 |2 F" a- s9 c12.echo create_password(6);9 i! B9 ?0 D: p- ?( G6 M

    1 A; K2 @% x: x/ s% }8 ~* H' b
    ( i- t: X8 D% N( ?( t# ~方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符$ E5 x  e0 ^- Y7 G
    2、在 $chars 字符串中随机取一个字符/ h. [2 E1 I2 Q3 V* e- b
    3、重复第二步 n 次,可得长度为 n 的密码' p# ~1 H! H" X  A* J+ ?
    view source0 e/ ^+ g  m$ s3 M: o3 z
    print?
    ; L+ M% T, C1 T! {% M* Y" T- I5 y. d% r7 o
    01.function generate_password( $length = 8 ) {
    # P& |9 D4 ~6 J1 Y: n/ E3 Q, C02.    // 密码字符集,可任意添加你需要的字符
    & M4 B( C" a7 [; l' ?03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    7 ~- `8 F+ X* G' k$ o/ i  O3 C# a04. 4 ~  w8 q  m) M! o/ W4 D/ O. [
    05.    $password = '';8 B$ \, O; r9 R( B% _! F/ W! w
    06.    for ( $i = 0; $i < $length; $i++ ) 5 b. M% y9 I& M4 J3 L5 J$ {- B$ N$ X
    07.    {
    ; [. h* [6 o; b08.        // 这里提供两种字符获取方式5 f" D( O0 ~3 ^+ |. H/ @
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    6 N) @. }& h9 r" H" q10.        // 第二种是取字符数组 $chars 的任意元素
    & g# ]% v$ F2 \8 I. c( s+ `/ ]11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    5 i/ G! V6 m2 s12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    6 M8 {9 x+ Y) [+ S13.    }4 J0 _. _9 e- l; n
    14.
    $ L% J! A; ~/ y$ c$ V. H  l# L8 I$ |15.    return $password;' g- q" h! @0 r& m" d. T" v
    16.}$ G* @6 T9 }5 N. w0 I" z/ y: y

    # B2 i7 Q  h1 P$ J: _
    ; p, e6 ^9 J+ [* g9 {. f: V方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符5 u4 D/ |( C' d8 Z
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    ' g7 E* N6 b! V) D- {3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    1 \1 l2 k/ B: o, J! `% \view source
    ( @$ B0 C' \- D5 w6 y2 yprint?
    " G: y( ?" X& M! Z$ S" N( a: C( h) @1 ?) [
    01.function make_password( $length = 8 )
    3 l0 K5 G" O3 A8 r02.{( `  \0 h- z9 k$ o/ z
    03.    // 密码字符集,可任意添加你需要的字符
    6 f0 }( Q1 b; h# D. C04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 0 i  z! z' ]# g' |; R' ~& f
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', : F6 F) [4 I* E. [* T$ T
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    / k- ?. i" V! [  n$ Z6 w07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O', 5 W8 T0 L/ a: z" L0 {! h# W
    08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', 6 X. ^+ G4 C$ L  C$ F
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', 9 N$ z3 ?% }2 E  s" Y, v
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    / }: H3 T  ~( F+ `( [; F8 n- b. c11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', ' v/ X- J6 C1 }9 O' e! W
    12.    '.', ';', ':', '/', '?', '|');( I) w8 F7 x  A# H8 t- A+ P
    13.
    , h( i' r1 k5 v, u. y7 z! m$ f14.    // 在 $chars 中随机取 $length 个数组元素键名
    5 q. t. h8 o9 a' v15.    $keys = array_rand($chars, $length);
    3 b4 L9 T5 m( `  G" Z, O( V16. 8 X% p, Z9 E3 |% e
    17.    $password = '';, {- N* D, q% a8 G# C# d( R
    18.    for($i = 0; $i < $length; $i++)) _& Y0 d1 b6 ?4 e  p/ A
    19.    {4 e/ j0 U0 h2 F% I& U7 j
    20.        // 将 $length 个数组元素连接成字符串
    - I' C! Z; ?& W) z' B: Q3 s21.        $password .= $chars[$keys[$i]];$ H& {5 c: ?& M8 v" o7 z0 h: F
    22.    }
    , r/ G# v/ X5 _, t6 ~. w23. 8 p' @1 q+ K/ e8 f) Z5 P' L
    24.    return $password;2 G3 [8 E( ~" L; b1 [' E+ X' i  |
    25.}2 m: m; W4 S# o( s' X& s% d
    : P/ g. {/ n$ B4 R

    ' m. j0 B" m8 a+ v) `, |方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:: o6 G  W9 B5 f+ ?) x8 O. Y, S
    1、time() 获取当前的 Unix 时间戳  U! M. n& H9 y- C$ g2 Y
    2、将第一步获取的时间戳进行 md5() 加密
    3 h0 V9 b3 O+ v' d3、将第二步加密的结果,截取 n 位即得想要的密码& Z; }' \- q) r( w/ T% A
    view source; a3 X: M' I, k0 F1 Z+ P
    print?" g, h9 B6 i3 Y( ]) w

    # q( x4 M8 `) T$ y$ z9 S1.function get_password( $length = 8 )
    : [& r7 r/ `9 k2 P. o9 P# ?; h7 C2.{  e8 Z5 V$ w5 G' a# n- G! L  ^+ V. \
    3.    $str = substr(md5(time()), 0, 6);3 x; O9 z) q1 F5 d  ~4 t
    4.    return $str;
    * }: w% o3 t6 P7 k# o5.}2 g, o- g8 w0 u0 b% r$ H* @. V2 C7 E

    1 B! n- K: h$ t7 }4 o- u7 i5 I+ u
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
      s6 G2 `7 l* G. ]$ Sview source
    . K8 Q8 [  K  w5 y7 ^" E( z2 ^* oprint?2 G/ o& d" m4 R. F+ k3 o* W
    " |1 W( k8 s1 T& {- {; f+ m
    01.<?php
    . x* r/ @& m6 ~9 ?02.function getmicrotime()
    ! \9 R  U5 X! b2 r3 U7 ~03.{, O8 r; M# r% I* P/ C- t& i; x/ t
    04.    list($usec, $sec) = explode(" ",microtime());% k. s; m+ |$ B) ]" r, V  J1 j
    05.    return ((float)$usec + (float)$sec);
    & H+ w& K5 }5 k3 ^$ \% B06.}% J! @/ j- m, Y/ ~: C
    07. 1 {3 d: }& i* i$ K) k7 @
    08.// 记录开始时间
    4 w2 N& @2 }) L) s) K* k) e' i09.$time_start = getmicrotime();
    ! ~2 R; n% u: }2 f1 J; F) `; b6 P10.
    ! i2 g9 J% J/ \2 Z, X11.// 这里放要执行的PHP代码,如:5 U- U% h: j0 c0 l4 B8 V! a+ i
    12.// echo create_password(6);
    ( Q3 y1 M( ^2 e8 [13. 8 F6 l; _0 \+ S- s
    14.// 记录结束时间
    & L5 Z( F* w) k$ k; A! v15.$time_end = getmicrotime();* y8 Q& A, V, Z$ P
    16.$time = $time_end - $time_start;
    9 s( e7 w: h/ l: _- h' K! p* x. ?2 a17.
    % d' R! n8 A/ ?6 |* [( Q: Y18. // 输出运行总时间
    1 s: D" p7 c, O1 ]19.echo "执行时间 $time seconds";3 R  e$ x/ L# o' Z# j5 N+ e  ^
    20.?>, T& [$ k) J$ d1 l+ R& M; O5 |

    ; w" h  C& A4 F- P( k! Y" D
    , d1 s& m8 O+ H8 C8 I/ y1 h最终得出的结果是:
    + @4 [$ l4 K. r- |方法一:9.8943710327148E-5 秒" r0 B0 ~0 u9 {/ a+ I9 A! D; m! H
    方法二:9.6797943115234E-5 秒
    " w6 E% y  a" q2 x; s; W- x  a$ a方法三:0.00017499923706055 秒
    , }8 `; q9 M  d  c2 `# t+ L方法四:3.4093856811523E-5 秒& A. l$ _* k$ j! K' A
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    & T, q' t8 ~  A" m; o+ x( e3 m+ T" f0 d3 l# r

    $ W% n( ~! x2 f9 o8 w/ |4 G
    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-18 03:40 , Processed in 0.420813 second(s), 53 queries .

    回顶部