QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2016|回复: 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,
    ' F$ ^/ P( h" ?. q2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    3 p& \7 m# J- |4 g3 G2 W; R% y3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    % D9 y( Q+ d, ]' n) {该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。( z* b- l; w3 |# b6 K
    view source# D4 y* ~- V  c  W
    print?0 W5 F* F8 a) [. e

    3 B( z7 ^0 G4 d/ P) L' q  K) M9 `01.function create_password($pw_length = 8)$ x( T  m( l- X7 R3 i
    02.{% p( }8 k& c: R
    03.    $randpwd = '';3 T2 r: y, e% |! d2 b) H. q
    04.    for ($i = 0; $i < $pw_length; $i++) 3 p$ ^5 c* J8 q2 x6 a
    05.    {: P" S: M" G" t4 s- r2 d6 c8 }# Z
    06.        $randpwd .= chr(mt_rand(33, 126));
    + b5 I+ H# i( g8 |07.    }9 ^. ?  W3 x) \
    08.    return $randpwd;$ N( W9 H) T# c! B# i
    09.}
    9 N" l5 T& e  c$ b5 ]10. 9 M! K( k3 A4 Y# \6 V9 U! t% W' x" ~
    11.// 调用该函数,传递长度参数$pw_length = 6- e5 j& [) q3 S0 {
    12.echo create_password(6);
    ! W1 {' {  T( `/ d0 W
    4 ]# `. h0 ?. ?2 [) y0 g8 t6 j$ T5 o1 x# A/ y& A" P* K
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符( ~* v* q4 T( B9 ^9 c8 u9 \
    2、在 $chars 字符串中随机取一个字符- Z% m1 H6 J" o) I
    3、重复第二步 n 次,可得长度为 n 的密码
    ( W6 n5 ?$ c2 y8 m; P2 Cview source
    ! X" N. o" f" [  U5 L4 `* fprint?
    4 N% ]/ m4 S1 a+ W" c* w! R; I' ?) j% O4 g. L( d1 ]# y
    01.function generate_password( $length = 8 ) {4 _5 }- d! s6 M2 J& \, x( T  P
    02.    // 密码字符集,可任意添加你需要的字符
    : T/ k5 a; y' }03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    * H6 ?% F7 @; k- z5 G3 E3 _' C04.
      I$ D/ c; T9 j4 Z: Y$ {05.    $password = '';
      b1 N. g( E5 p06.    for ( $i = 0; $i < $length; $i++ ) , _$ B7 h5 H9 E0 s  X
    07.    {/ ~0 `" y& Q5 n# I
    08.        // 这里提供两种字符获取方式2 T6 A2 M+ C& X
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;( \' y9 ^* T8 x5 ?2 F
    10.        // 第二种是取字符数组 $chars 的任意元素3 y' g: V% ^+ y
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);3 h4 R7 E( t+ W' [8 \, v  [3 _
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];- Y: z& z9 I) h. Y. Q
    13.    }
    3 K2 N1 x/ I; C14.
    3 i2 \3 g' d1 E% y15.    return $password;
    2 T' \) R5 _) K5 [$ s0 N16.}
    ! J' a2 P5 ?  R7 R7 G# N1 _8 [7 d( S5 k
    + c; ?  S/ e8 {& o; r7 n' d$ |1 E5 n- }7 i# R. x5 B8 N, e- P
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符; d( F- c0 ]3 v' j3 k
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素2 e4 Y  B3 Q7 d, O
    3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。+ @$ |* K8 N1 [* z) G" H2 U  J# x" |
    view source, ]0 O& B, a. O( c2 g
    print?7 V! @/ A2 a, R
    4 R2 H# ^% d1 ?  L: u
    01.function make_password( $length = 8 )* X( t8 g1 ]( m
    02.{" m4 W+ h! m/ m8 t8 e# C+ ~
    03.    // 密码字符集,可任意添加你需要的字符
    0 d0 @. F0 {- q. P7 s8 b  A1 l% g04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 2 C/ E: c, B6 E$ D% \$ U' v+ P: b
    05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', , l6 G- d+ T  j, {# N, D
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    , d0 _+ V+ r, L/ l8 F& f  e07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    6 ], Y. q5 V) o9 Z5 {' E7 s& O08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', % B3 _- e+ m, K; U' [; r* g! R, }
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', - S8 O9 w; Q* y! S
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
    / R% E: V, A+ r1 x11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    3 u. [& z: ]1 I8 A$ E4 q12.    '.', ';', ':', '/', '?', '|');6 N( e' L5 L: z5 L4 j; Z; ~
    13. " k* m2 {6 q- s. W
    14.    // 在 $chars 中随机取 $length 个数组元素键名0 g% N1 z. u5 ?
    15.    $keys = array_rand($chars, $length); 1 J' C( n4 H3 f) ?8 v
    16. $ x& s2 w. y- ]. X) ^/ x( T
    17.    $password = '';
    % c& B( D: G4 q. j8 S. P18.    for($i = 0; $i < $length; $i++)
    ' {; W+ y' ^. u. l5 `, W" d19.    {: Q3 W! k, F7 {
    20.        // 将 $length 个数组元素连接成字符串( j7 e7 `. ?  z/ H9 y
    21.        $password .= $chars[$keys[$i]];! }3 N/ }0 [5 c8 J
    22.    }- L. F) [4 l; c+ k. O3 L( o
    23.
    7 J! U3 d( z  N1 O6 V24.    return $password;
    9 ]( _# J7 G- Q25.}0 W; w9 x  ]$ }0 Z% w: M0 B5 J
    7 x: _8 T2 C8 z1 G

    & \: K) z/ r. C1 N9 u" `方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:3 E9 a/ d6 ~- I3 a6 \
    1、time() 获取当前的 Unix 时间戳
    * e* l. m) {7 ]. b! F9 s/ a3 q2、将第一步获取的时间戳进行 md5() 加密8 Q. Q$ Y3 S" o  W! I. ~
    3、将第二步加密的结果,截取 n 位即得想要的密码
    5 L+ J3 x# m+ t5 K/ I, g+ \; s: Y3 Eview source5 }3 i/ M% _; X
    print?8 ]( Y! W; e: U
    $ v! M2 N7 S8 _' p# N2 P, I3 p' h. @
    1.function get_password( $length = 8 ) * \& c5 V! S7 c/ [! ~
    2.{
    + S0 h9 v9 p6 N* @3.    $str = substr(md5(time()), 0, 6);, y; t8 ], V0 s9 x
    4.    return $str;
    * n2 `/ ^3 `5 @/ k" J# t% u" @' j5.}) }2 g4 }' d' S7 t( v7 k
    ! {; }* L& P: ^

    $ P9 ?3 |2 l5 e% E" M时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    % V* c1 t6 J% b2 xview source
    * M  L% h1 z% l6 Gprint?
    + q# G3 D1 p- j  b8 j, \3 `9 x2 e+ {
    01.<?php
    & h+ X6 b, W  d+ D02.function getmicrotime()
    * H" p/ w9 {. W3 X  }03.{/ g3 p5 z% R7 r
    04.    list($usec, $sec) = explode(" ",microtime());5 @' L) V) h3 l1 r0 o4 x6 Z; {6 F) e
    05.    return ((float)$usec + (float)$sec);5 C+ v- a5 [. V$ O* s! F: {
    06.}
    ! C# [: I/ Y0 h2 U07.
    8 @: e+ s) \+ q" K- r; @( t08.// 记录开始时间  T- u1 A: E& n7 x# Q, p' \
    09.$time_start = getmicrotime();) B& e2 q) q. E# {, }% m" |
    10. 9 q4 L% N( }1 ?( x7 D5 h8 s
    11.// 这里放要执行的PHP代码,如:
    1 U# X& ^5 T5 ?/ T12.// echo create_password(6);
    . y# ?6 P$ t- R; J13. ) v- B0 {' ?  b8 p
    14.// 记录结束时间7 V) Z, v5 r$ L: n
    15.$time_end = getmicrotime();, P9 X3 P! S& k! P1 J% }! v
    16.$time = $time_end - $time_start;$ r- z1 s. N" ?
    17. 5 ]% L  U/ ?5 o: |9 I) M" t4 l; n
    18. // 输出运行总时间
    ( H- w4 B, B. y9 J6 G0 O19.echo "执行时间 $time seconds";' T/ d' Q, V7 H: S! t
    20.?>
    9 G* ?6 C$ O! j" R. V) Z) K  ~3 j2 T: w' \1 F. y, ~
    9 E4 ?$ C. K9 H# \  h. V
    最终得出的结果是:
    ) @5 O8 n! |0 X$ Q方法一:9.8943710327148E-5 秒) L  J: m% c0 h, r$ G4 P4 E
    方法二:9.6797943115234E-5 秒% N* e3 B; B% R. f* K( a: [1 Y
    方法三:0.00017499923706055 秒( `5 m2 E$ U' H) ?. y- A- {
    方法四:3.4093856811523E-5 秒" l) `3 L3 X8 t
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    0 y, O1 T# j' U! D2 I( Y+ V: s5 R! L3 p2 V% G  ?6 i  q- P

    , a# ?% N$ a6 y" ~
    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-18 19:26 , Processed in 0.257152 second(s), 51 queries .

    回顶部