QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2364|回复: 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 X+ `" r5 `9 _( e, N
    2、将 35 转换成对应的ASCII码字符,如 35 对应 #8 h( V0 G/ O6 v9 x6 n6 e7 d
    3、重复以上 1、2 步骤 n 次,连接成 n 位的密码- L6 P6 X1 t9 j/ U. `/ j& ~
    该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    $ S8 C4 A- x0 [5 hview source
    6 Q# ?& `+ l4 D1 {' ~4 jprint?
    " h4 R2 ^2 A$ p' I0 o$ S8 B' z  v
    1 m6 V; r; {. E$ B, [* T0 h01.function create_password($pw_length = 8)
    ) V4 e- U7 I- u6 L/ d4 b' `02.{7 M1 v# j2 `+ [: C+ M3 ?
    03.    $randpwd = '';1 T$ A4 z: O8 e/ f/ a0 D! Y
    04.    for ($i = 0; $i < $pw_length; $i++) - Y7 c6 j$ g0 h
    05.    {
    5 ?" M. C, k7 [0 p7 O06.        $randpwd .= chr(mt_rand(33, 126));7 f4 {, R/ G1 l
    07.    }
    ) m) H  R5 Z" m0 G0 h08.    return $randpwd;
    + K4 x" G" ~& o8 L: M5 s& p. p09.}& G- j  V; E; n2 A
    10. 5 z3 c1 k# I1 i2 E
    11.// 调用该函数,传递长度参数$pw_length = 6
    ) S  L- E' R; [/ z+ E; u12.echo create_password(6);8 H" O, h" J$ D. u
    $ s" G: R8 N7 c( v0 ~

    3 ^+ [. A. F8 X# E* l- ~0 G4 E; E方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    # ~5 C! G9 q( d" W3 X2、在 $chars 字符串中随机取一个字符( W2 L) F7 N1 O1 o
    3、重复第二步 n 次,可得长度为 n 的密码3 N- G+ @$ e- C5 h. v- f
    view source' X0 i+ M% n$ H
    print?0 o2 J5 O4 W3 @
    - E9 O) C9 p, x  l6 G
    01.function generate_password( $length = 8 ) {
    2 i4 W  }4 S* m- I# E. B5 G* j$ S02.    // 密码字符集,可任意添加你需要的字符
    1 A7 I& d, v3 V" D03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';: v/ {9 `1 o: G3 e, Z+ _
    04.
    0 c/ t, l" S. A! D& W05.    $password = '';; d+ n: s" h  C" A) o
    06.    for ( $i = 0; $i < $length; $i++ )
    7 a8 q8 k& P0 I1 P4 a* J+ G07.    {
    4 n  e7 p6 Z2 o6 D; ?2 b08.        // 这里提供两种字符获取方式
    ' H, _4 _# g" P* {2 }" I2 [! V3 a09.        // 第一种是使用 substr 截取$chars中的任意一位字符;
    8 o. F' m, ]1 l10.        // 第二种是取字符数组 $chars 的任意元素
    - J3 e, v# V  j; R11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    4 f0 |, r* @" R8 a8 `12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];7 o8 K2 P  y% y) o
    13.    }
    , |, M$ h8 r5 l& w14.   i" P# q- P4 H
    15.    return $password;
    & y. c8 u8 ~" Y2 Y5 r16.}
    * H& i0 N; \5 i
    + p5 V7 Z; T* k/ G% k- Q0 w+ O0 r8 T1 a
    方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符% X2 ^# Q; Y  [
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    3 q- i5 Q: j  ?2 P4 z6 ^3 |$ a" p+ g3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。
    " e: o8 B! n2 [: R2 X8 w  }view source2 a# K+ m1 `1 t: e9 h+ i
    print?- l2 X7 K( O$ o8 A9 I: z# m
    2 l( c/ Z0 [1 t( h- U8 L) D& E" R# Q# S
    01.function make_password( $length = 8 )6 R$ D4 f9 B" _2 o% g* [6 b! ^
    02.{
    : T6 L5 q: a3 f7 l* P6 S03.    // 密码字符集,可任意添加你需要的字符7 o$ x9 t) ~  c
    04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
    " n9 e9 F3 e  G1 S/ X1 `05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', / `+ g- N3 q* H$ c" j3 z
    06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    2 L) l4 h: L4 U  R. h1 L1 K' k07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    + T1 |0 ?- h# J5 T- J2 D7 s08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', % s3 z6 C/ v& d6 m: P) N, h
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    3 w- G; Y1 c. S* x10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', ) m+ P' T2 v: E, T
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',', - Q: p6 {) |0 S6 {0 K- s
    12.    '.', ';', ':', '/', '?', '|');4 E6 r4 ?. c8 T& `  ?6 b
    13. ; \9 `' e+ T8 B3 P
    14.    // 在 $chars 中随机取 $length 个数组元素键名8 Z& D) l- s+ ~/ z
    15.    $keys = array_rand($chars, $length); * f7 m0 p' L7 J9 K' h- w, c# o. }
    16. + j0 Q* z1 t. Y) S  Z
    17.    $password = '';
    + P( E5 r1 u! L7 i18.    for($i = 0; $i < $length; $i++)# J- u# @% w) [
    19.    {0 {' X1 k- w8 e' b& {4 }) }8 z
    20.        // 将 $length 个数组元素连接成字符串
    2 r+ D$ O1 e' l21.        $password .= $chars[$keys[$i]];7 k; J' a, Y& D; z$ h
    22.    }
    + i& u& K# n' J( d* n6 ~23.
    ( J/ F& o8 [/ }3 y- P3 t' x8 `24.    return $password;& b  i; F$ W9 c  ~6 n
    25.}
    ' g- c( j1 H9 m) x5 e% Y3 O' O8 a8 v* t" l0 K2 H. ^+ P3 F
    6 g* A: o9 G6 U. x' u1 F2 t
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:6 Y' x% V( d2 M
    1、time() 获取当前的 Unix 时间戳2 V1 l6 Z8 }# r  a4 @
    2、将第一步获取的时间戳进行 md5() 加密
    & T3 `9 |5 ~6 e0 ^9 `3、将第二步加密的结果,截取 n 位即得想要的密码
    - W) i: J  C4 j5 d% z& S% W8 \view source$ a# O; h$ U2 o* f
    print?5 Q' X5 {. k: }

    + R- C/ ~: x" z) D. \: |1.function get_password( $length = 8 )
    # H! A6 T# w5 Y2 a8 b/ W2.{8 `" x+ ^, O' _  E  C
    3.    $str = substr(md5(time()), 0, 6);
    7 Q- y2 ~+ K% T) M4.    return $str;
    - O. q$ Q8 n* ]7 D! p& M5.}
    # v' g7 J1 J6 Z1 d# }
    7 x+ ~5 k% ~( o2 @
    * \, w) I: A8 T时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    3 M+ G3 y) W+ I' k! ]" Yview source
    - t! \; X. D: e* p4 [# B9 _9 u. Eprint?
    6 `& Z# l* R8 ~" G1 [& X" Q5 R3 C  X
    01.<?php
    * e) u5 Y4 H0 d0 y- X3 m02.function getmicrotime()
    ) [5 Z! v9 e2 v! H03.{. D# [' W+ W5 r: B. Q
    04.    list($usec, $sec) = explode(" ",microtime());
    ' e1 I+ C5 M: m# f0 [05.    return ((float)$usec + (float)$sec);1 H+ \4 F. E. M/ ?2 ~
    06.}
    % B6 }; L* K5 c07.
    4 X5 m# h' q, m$ X5 O6 J08.// 记录开始时间- |1 |" g' h- l" {2 x. N
    09.$time_start = getmicrotime();5 d1 I- w/ ^  T  X$ u0 K1 D# q
    10. , X# s. J+ Z7 H% }5 g
    11.// 这里放要执行的PHP代码,如:
    4 W  F( o3 O' E1 I# _! }12.// echo create_password(6);
    # [( o( q' I- N# C" ]" M6 m13.
    ( z$ d8 i' m3 G% |7 N$ J. }14.// 记录结束时间
    ) v% Z. z$ E: ~- l15.$time_end = getmicrotime();
    # @. a2 \" u, n+ K16.$time = $time_end - $time_start;) W  F4 t% k5 @, v
    17.
    3 G3 u! H' c& d: Y' \8 m$ m18. // 输出运行总时间 6 h2 Y- C+ U" M# b
    19.echo "执行时间 $time seconds";# w4 P6 S( s& ^5 }7 I; J
    20.?>
    $ L6 N* a3 _. z. o* f3 ]( q
    9 e# k- c1 U. |( c( z7 t6 U4 ^7 H4 a7 l, Y3 H8 F4 N
    最终得出的结果是:7 O+ ?/ F+ f3 L/ q: `
    方法一:9.8943710327148E-5 秒2 A5 T; |: R$ h$ @  X1 k
    方法二:9.6797943115234E-5 秒
      h8 @( v$ }1 M方法三:0.00017499923706055 秒
      N* T! Z/ r# E8 K# K5 x方法四:3.4093856811523E-5 秒
    & Y2 z2 H0 b: W可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。$ G7 \7 V3 O  G! r6 `0 j
    ' f* i5 a& o$ o# a4 v1 }$ _

    9 Y; Q+ F7 G) j: I/ W
    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-8-31 12:37 , Processed in 0.433034 second(s), 52 queries .

    回顶部