QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2090|回复: 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,
    * M3 f, P; {8 V% G2、将 35 转换成对应的ASCII码字符,如 35 对应 #
    ' w2 H6 p6 o8 i( W7 ^. @9 }. l: Y& l3、重复以上 1、2 步骤 n 次,连接成 n 位的密码
    / S' a2 v: Z: G9 l; n该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据需要调整范围,如ASCII码表中 97 – 122 位对应 a – z 的英文字母,具体可参考 ASCII码表chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。
    & O% T- K8 c6 F4 H% r) o  P& jview source
    - ~2 }% z8 |$ ~7 q5 vprint?, W* X# s$ Q; g1 u) J: @8 K- v

    + v% Z! O! {# X01.function create_password($pw_length = 8)
    0 g" z, Z  J6 j02.{
      [- s/ l2 U8 C& F4 B' h  Y1 B03.    $randpwd = '';8 d0 F" o  m- d9 h& w  B9 B9 N' }* I
    04.    for ($i = 0; $i < $pw_length; $i++)
    3 _4 ^9 h2 v6 p3 y  O7 P05.    {& S( G+ K7 p8 j# D$ x2 _/ T
    06.        $randpwd .= chr(mt_rand(33, 126));
    $ d% D) _6 f; B( X& G) L1 t07.    }
    ! w) h* S4 f# e2 k( g08.    return $randpwd;* O( T% {) x' H) K- J. @
    09.}
    # x; o. L- A' [2 A10.
    " s2 N$ z3 d& w7 K! U' w11.// 调用该函数,传递长度参数$pw_length = 6
    # J; J' m) |4 N5 W4 }& T3 a, W12.echo create_password(6);+ n, P% l- \5 R. N: @% @! h

    - v0 i' l* {& [* q4 n  Z7 N( C' X* y8 J  c& I
    方法二:1、预置一个的字符串 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符
    ) e0 E* z9 p" x( [7 m( E) J2、在 $chars 字符串中随机取一个字符
    & r9 r& \3 n# L! n: ~" _, }: C3、重复第二步 n 次,可得长度为 n 的密码
    2 S2 p. J& N6 s) g) j7 M# Nview source- q8 M) X6 ?. W9 b3 Z8 D
    print?
    8 N, u9 @5 N% L$ V1 Z& _  B  \; m  u% A; F7 p( ~" H3 C5 S
    01.function generate_password( $length = 8 ) {9 H! E! g/ _: j- r3 d( j
    02.    // 密码字符集,可任意添加你需要的字符8 Q: D& {2 L* p, @, o# P$ P  e' {6 _6 A- |
    03.    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
    ' R  s; X. E+ ]& z. u04.
    0 s+ ^, a, r$ \2 V7 L0 a* a05.    $password = '';) w' U( v& W$ M
    06.    for ( $i = 0; $i < $length; $i++ ) 7 m1 A+ S: d9 U0 a
    07.    {5 x' a% L' j4 \
    08.        // 这里提供两种字符获取方式
    ' @; Z3 C  @$ B, u1 y09.        // 第一种是使用 substr 截取$chars中的任意一位字符;0 w2 w  x1 q! J2 e" \  Z) w  F/ o
    10.        // 第二种是取字符数组 $chars 的任意元素
    + d( x2 C! o/ [0 Q& q11.        // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);% |5 E; [2 J$ F2 e8 D
    12.        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
    3 _+ x4 Y2 k8 _+ B+ S8 e7 A% b13.    }$ ]3 }) D$ r& k
    14. + X/ \) L* K' \- s' w  |2 x  K8 F
    15.    return $password;7 q) \) J# K% o9 J" [  U
    16.}
    " ^. C, b9 Q$ B( W/ i% Y3 y, T3 a" M) e' j/ ~% _

    3 T3 \7 @! @' g- _0 Z方法三:1、预置一个的字符数组 $chars ,包括 a – z,A – Z,0 – 9,以及一些特殊字符) v) }* q$ }. V
    2、通过array_rand()从数组 $chars 中随机选出 $length 个元素
    ! r# M; t3 N: p& |3、根据已获取的键名数组 $keys,从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。( @( |! f. q; e( d4 r3 ?5 H
    view source
    6 |4 t5 D& S: yprint?4 a6 S( p3 E& d1 L6 e# r7 t
    ( `; e  @9 w- g/ U. g
    01.function make_password( $length = 8 )
    1 M0 _% s# h. D( k; e% }: r02.{
    8 y) }, Y1 L+ R8 B03.    // 密码字符集,可任意添加你需要的字符
    % Z/ I/ A  ~1 u7 P6 h+ C3 S04.    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
      I+ C) t, A" N6 N% q05.    'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's',
    / R5 t9 Q; V  {% q+ a. D06.    't', 'u', 'v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D',
    8 {$ j' |4 O* `2 j- r07.    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O',
    0 B' ~& q/ ^& {& G  R/ Z, p6 }08.    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z', ; E- w  y5 @8 w+ @
    09.    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
    9 V! }  y, ]0 {, \/ [7 {$ s10.    '@','#', '$', '%', '^', '&', '*', '(', ')', '-', '_', ) J9 L7 z1 @. R1 {. [
    11.    '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
    5 r' o( z2 _" \( I( m" Y) s12.    '.', ';', ':', '/', '?', '|');
    % K$ i* o- ]# J/ K( |- ]5 c+ _13. ( T% m5 b8 y2 D' q* y% o
    14.    // 在 $chars 中随机取 $length 个数组元素键名5 e: t3 t! `2 P' c
    15.    $keys = array_rand($chars, $length); % C: F' z! ^& l+ l2 H! y, B. t
    16.
    ( U1 j7 f3 F6 G0 Y! Q& R17.    $password = '';
    ( @; `' r' O- ~6 t18.    for($i = 0; $i < $length; $i++)1 D# J$ m3 l+ W& w/ [, p
    19.    {% l3 R% X8 c$ B
    20.        // 将 $length 个数组元素连接成字符串! ~2 y% R7 l' ~
    21.        $password .= $chars[$keys[$i]];% N( _- X5 F. D$ @. ?9 c% J
    22.    }
    6 m( i2 \/ e8 H. Z. t) w/ X# X7 j23.
    4 r2 a; M- v, y& ]" u24.    return $password;( P* J5 Z! J6 F) L. o  s
    25.}
    - x  S8 D' U6 k6 |- @$ u
    " V. [3 R0 a8 p0 e7 `$ c, R* f5 |- Q- J7 F; G- N
    方法四:本方法是本文被蓝色理想转载后,一名网友提供的一个新方法,算法简单,代码简短,只是因为md5()函数的返回值的缘故,生成的密码只包括字母和数字,不过也算是一个不错的方法。算法思想:
    ( e! ^8 ~1 I* t& U1、time() 获取当前的 Unix 时间戳: k+ }5 ]( Q" E2 W9 \
    2、将第一步获取的时间戳进行 md5() 加密8 t2 [% b, Y% S
    3、将第二步加密的结果,截取 n 位即得想要的密码
    & U/ o/ ?1 a' _9 S( Y  Kview source$ ^6 h6 U' e/ W1 b3 V/ Z
    print?
    6 O4 W' \8 a' E/ ^* R5 L) K% C& \1 v
    1.function get_password( $length = 8 ) + n* q, O0 ^% r" R" f% P2 @9 o; \
    2.{
      K  k) ]3 }% o/ Q6 J) C  t3.    $str = substr(md5(time()), 0, 6);: x& I* b. j1 s) Z
    4.    return $str;5 C2 `' p2 A. t. f) E9 {- M5 Q
    5.}
    * p( a6 [6 z9 d3 y' @, w, D, J8 F0 {1 {
    * q; l7 v- k7 Z# t
    时间效率对比我们使用以下PHP代码,计算上面的 4 个随机密码生成函数生成 6 位密码的运行时间,进而对他们的时间效率进行一个简单的对比。
    8 y) O$ J0 n7 O8 nview source/ H# z9 v% V. p) s( y; t
    print?8 g1 d" P# V! N8 R9 r8 J$ G7 b

    / q5 c3 L. @$ I% s* S! X: X01.<?php
    " P" m" R" ^1 u( c1 g02.function getmicrotime()8 M) ~- O& f  N- T% Q' M4 m$ n" \9 m
    03.{
    1 S2 o! R+ i8 ^9 x( O& Q) S04.    list($usec, $sec) = explode(" ",microtime());
    3 z5 q) w; I# i2 E05.    return ((float)$usec + (float)$sec);
    ; c: h+ t9 U$ y0 k9 q  I06.}
    # h  O0 v5 T, R- R4 n07.
    : X5 |. d2 b. H3 Q- i0 E9 Q08.// 记录开始时间
    % D0 m+ B$ V- o/ m+ W& d1 A09.$time_start = getmicrotime();3 `1 z) d7 X1 B+ h  i
    10.
    0 |  n2 y- ^& ?5 O; v: b- t11.// 这里放要执行的PHP代码,如:
    : r( }- p9 t0 X$ X3 _% e12.// echo create_password(6);
    5 Q* v! M3 J) U* J- X' M13.
    9 E5 U3 ~8 x7 y4 r! f6 B: \14.// 记录结束时间
    & W6 X5 F; E2 \9 N, K15.$time_end = getmicrotime();! C0 U1 ^- H0 [& `( ~1 w- j
    16.$time = $time_end - $time_start;
    ' n. O& A( k8 L2 ]5 L; i17. ' Y! C( x6 n. x6 }9 p, g" x* ]1 L
    18. // 输出运行总时间
    & s! @5 f6 s; e+ ~' b19.echo "执行时间 $time seconds";
    2 u- F) ]9 V* E/ g+ m20.?>: N! ^/ p/ M" h% R0 t1 z+ Y9 v

    # x; s# F. |' y7 s$ J8 [6 }/ I
    & U1 O0 N/ N* g4 {最终得出的结果是:" M8 p  w0 p  v( t* [$ R" k6 b2 i" _
    方法一:9.8943710327148E-5 秒
    9 Q, r2 |" P/ Q4 p0 E; r( _方法二:9.6797943115234E-5 秒: |. F+ }4 Q5 _( Z! _2 }0 Q$ x
    方法三:0.00017499923706055 秒
    ; d! T  F# t" y8 E6 B. z方法四:3.4093856811523E-5 秒
      [2 l' @3 u+ T0 V9 S可以看出方法一和方法二的执行时间都差不多,方法四运行时间最短,而方法三的运行时间稍微长点。
    6 d' r; T. g0 c) Q5 }, ^+ [- Y' |6 A' f# ]

    + @6 D" W# y9 _8 v
    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-10-24 17:56 , Processed in 0.316776 second(s), 52 queries .

    回顶部