QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2270|回复: 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,
    + O' K8 d- f7 @# W& C/ ?; c2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    $ q. ^+ E3 D# J& E" U1 B5 e3、重复以上 1、2 步骤 n 次,连接成 n 位的密码9 o) U, _. F( _- K" y8 M- ?
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。  K/ b# P3 ~4 z0 t1 e2 K5 `5 F
    view source
    " l" S  k& e. `/ D6 ~print?% F  c, [' J/ T1 ~: v6 x

    9 G& h( s% ]8 M- I01.function create_password($pw_length = 8)5 H; o- S% U8 i" F0 A. ^
    02.{
    + q  \; ~7 v( m/ ^+ L03.    $randpwd = '';0 S# A, B0 G/ V6 u
    04.    for ($i = 0; $i < $pw_length; $i++)
    1 W. F) n7 S( b' J3 S05.    {& {) h) e4 ?9 \& y6 e) c2 G1 l6 L
    06.        $randpwd .= chr(mt_rand(33, 126));( n$ O( z* v* Q; z% r6 K
    07.    }
    & J2 C3 p2 _# B5 n08.    return $randpwd;9 W- I# F1 A+ [1 A/ y# _* H
    09.}
    & B& v, R9 ]5 p" W10. ! i3 ^" s% T1 N: `8 E% _. o
    11.// 调用该函数,传递长度参数$pw_length = 6
    0 R6 h4 s+ r+ |& N8 \7 w12.echo create_password(6);& m) m* k! p1 d0 h. Z

    7 t8 E. f1 E8 f/ z( J9 j% S! e
    . ^$ f+ ]( v* J: B! c3 n$ F方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符8 b+ w( H- _1 ^8 x. P' z" l
    2、在 $chars 字符串中随机取一个字符
    4 C- h' x1 ]6 x* ~9 L3、重复第二步 n 次,可得长度为 n 的密码1 f& L. D5 d9 k
    view source
    5 M% l. Q  ^4 q5 A1 |8 Oprint?7 D. t6 e# _$ K) e6 v
    2 c+ b8 E/ f/ `; K
    01.function generate_password( $length = 8 ) {: Z: I6 _% w8 p* C" g
    02.    // 密码字符集,可任意添加你需要的字符
    $ z4 A3 v: T7 e0 t03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    7 x; E- Q7 V  n5 J04.
    ! T) z1 u! _6 [% _3 \1 U05.    $password = '';
    - U. x- Y4 F) x* w( E/ S1 m06.    for ( $i = 0; $i < $length; $i++ ) , o5 [: P) L3 k
    07.    {9 ^! |' ^: X* \9 G7 w3 a. g2 B
    08.        // 这里提供两种字符获取方式/ ~0 ~: g0 _+ R, V4 s2 `
    09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    ) k8 }9 q' M9 t5 G  ?10.        // 第二种是取字符数组 $chars 的任意元素& B8 [- E1 @) L/ y: U9 T
    11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);6 y, P- M' D- r. C: V% V% c) s8 a" j
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];' J- b. M  l7 `- C$ b
    13.    }) `& w6 `! t2 n4 [, e5 L
    14.
    # ?; Z( E; v* x1 ~7 }! S15.    return $password;# ~' F$ U, w8 {9 c) G* P. {# V
    16.}2 t4 {3 _% i7 I0 s: i0 `( S2 V7 c

    & Z4 m; P9 E2 ~; u% Y3 o
    + S3 y- I2 ~! k- s" l8 a; L: H' b方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    + N6 G4 @) A$ `( t+ w1 y2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    / O7 t+ j: m1 @7 H  s- N% l2 z3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    5 B# D: P! @5 s) |( x  Y" r) k  s4 Pview source
    + s& q3 I: b; O$ I2 y) E' n' I9 F9 o! }print?% A# Q+ z2 R3 N' e  j

    / X: z3 W! M  Q01.function make_password( $length = 8 )
    6 [6 P! ?6 v) D$ x% q0 y0 Z02.{
    / I& z8 e  u8 T5 W03.    // 密码字符集,可任意添加你需要的字符2 _% R4 n- b9 {8 A
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    - L+ ^& m4 q; M5 T6 ~5 E6 D05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    7 N, A: o8 n* i) d' i5 o8 H06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    9 u9 X# x7 e% X; u& J9 A4 Z; V07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    / v8 p  ~) x. a6 C' v08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z',
    & _/ D* B/ B( J' V  P' T09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', , r6 z/ d1 z1 g7 c' q, {
    10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
      ]' e* p3 i* n# [' p  {( p11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    * a# \/ k* }7 L# B; F2 w12.    '.', ';', ':', '/', '?', '|');
    # j2 G* g9 G* F# V" M( r* o13.
    ( Y. p: B0 o& a  ^14.    // 在 $chars 中随机取 $length 个数组元素键名' W4 Q6 q0 Y8 {) ?3 P1 w4 D6 w
    15.    $keys = array_rand($chars, $length);
    ' r  g+ v, [! o8 |  g16. ; f3 q& p) F8 [
    17.    $password = '';
    9 f& D( W( X' _/ J18.    for($i = 0; $i < $length; $i++)5 f: H8 m3 u( f# O4 b
    19.    {
    + A, d5 {2 e0 B20.        // 将 $length 个数组元素连接成字符串
    % [/ i2 \% B7 l5 ^, a21.        $password .= $chars[$keys[$i]];1 O# H) K! O: R  a$ @( b2 ]; _
    22.    }% D* C/ h7 _8 Q  t+ z
    23.
    ; Y7 \6 u# U* U/ D/ h24.    return $password;
    " \0 Q4 E" }9 {- n. C3 a25.}
    & h$ X% G2 Q4 z& K- B* d! C1 N9 q0 y  i5 f; F, W/ U

    ) W) B* x5 T" j1 P方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:# k0 h0 U6 L7 D5 @  B0 E% F; M
    1、time() 获取当前的 Unix 时间戳; A6 s- H9 C) ?. b
    2、将第一步获取的时间戳进行 md5() 加密5 V( j8 D/ W! @/ l
    3、将第二步加密的结果,截取 n 位即得想要的密码
    8 y5 P) z" k- ~2 l* W: _view source
    3 Q2 u7 z4 d0 s  B/ h* iprint?
    ) k! @8 [) J; j! C3 l% N% m* ^' o2 I9 R: W7 ~5 t; ~+ u
    1.function get_password( $length = 8 ) . j' s; T$ e8 W# ^( @. Y
    2.{9 v/ n: f5 r- S2 Q* \
    3.    $str = substr(md5(time()), 0, 6);0 \, w. c* a* I% e9 \" {  O
    4.    return $str;
      Z7 A2 Z" n/ ?7 ^( {/ p5.}0 _' q9 c" Y; p2 f/ ^( F" N

    2 g3 x5 |/ V: T; }/ ^: C% q) P' [8 r$ s3 ~( F
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。- q6 b* U2 Z- x* E
    view source+ F; Q- V! k9 w
    print?$ U, C/ {# Y* f& r8 Q
    4 J  X. e+ v' Z7 Z/ S; N
    01.<?php
    2 E# q8 T/ e* F: [02.function getmicrotime()3 p8 @8 _' j7 u' h" e
    03.{# N. }, J- p0 i+ e7 i
    04.    list($usec, $sec) = explode(" ",microtime());
    $ T7 z& C, a# W& M, M! E05.    return ((float)$usec + (float)$sec);* j( b6 M+ ?3 e) p) n$ c" I$ K
    06.}
    : I" y9 }7 c9 H07.
    , B! }; b& B1 `- i( V08.// 记录开始时间
    5 U, ~9 ?, I0 j& k" u09.$time_start = getmicrotime();
    ( }0 f8 S) j* H10.
      o$ y1 h" X* \+ f, r* m11.// 这里放要执行的PHP代码,如:1 _* L/ L' ?3 Q  i
    12.// echo create_password(6);0 a$ }4 a1 K9 {" @3 }; V
    13.
    " O! V3 p7 J' r, `. s* L14.// 记录结束时间
    ! s* b7 j- z4 N3 z  X% H# B15.$time_end = getmicrotime();3 ]; g  G& G6 f% y9 V
    16.$time = $time_end - $time_start;' \+ [; X% {, r! s' A  _! g
    17.
    * E$ p& u! `2 r& v: [18. // 输出运行总时间 ' L, q5 e/ N9 t
    19.echo "执行时间 $time seconds";
    5 x$ X5 Q/ \5 O8 |- L7 t6 Q. P; n20.?>0 o5 Z) G( m9 p( g' y  n( A% K' Q

    / X* D, n8 u- |4 n8 a0 ?5 y. ]- \7 @) a6 A2 J
    最终得出的结果是:0 l4 @# I  h1 s6 j! k1 w" p
    方法一:9.8943710327148E-5 秒7 S, z: C- y+ C- S+ n
    方法二:9.6797943115234E-5 秒' ~" A, ^" M& N( J' Z
    方法三:0.00017499923706055 秒* Q  ]; Z" V+ ?6 ^
    方法四:3.4093856811523E-5 秒7 m/ ?" v: `4 q) R7 ]
    可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    " r% m1 K" C, G8 u  @5 r
    * A! _. ]: A' I, c. u  \8 e; [1 E# g8 @% \7 q& `+ x# E: f
    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-13 03:13 , Processed in 0.310825 second(s), 55 queries .

    回顶部