Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Моя функция создания случайного пароля


Автор: InfMag 24.12.2007, 15:17
Вот функция:
Код

    function genpass($symbols=6, $numbers=1, $lowers=1, $uppers=1)
    {
        $chars = ''; $result = '';
        if ($numbers == 1) $chars .= '0123456789';
        if ($lowers == 1) $chars .= 'qwertyuiopasdfghjklzxcvbnm';
        if ($uppers == 1) $chars .= 'QWERTYUIOPASDFGHJKLZXCVBNM';
        for ($i=0; $i<$symbols; $i++) $result .= substr($chars, mt_rand(0,sizeof($chars)-1), 1);
        return $result;
    }

Когда запрашиваю просто echo genpass(); выдает - 000000
mt_rand(0,sizeof($chars)-1) - походу постоянно выдает 0, но почему?

Автор: skyboy 24.12.2007, 15:44
по видимому, sizeof($chars) - 1 возвращает "0" или "-1".
попробуй вывести sizeof($chars). 
для строк есть http://php.net/strlen - попробуй её.
кроме того, до версии РНР 5, генератор mt_rand следует инициализировать при помощи http://php.net/mt_srand

Автор: MoLeX 24.12.2007, 15:50
InfMag мой вариант smile 
Код

$nabor = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "Q", "W", "R", "T", "Y", "P", "S", "D", "H", "K", "L", "Z", "X", "C", "V");
for($i=0; $i<mt_rand(5, 25); $i++)
{
    echo $nabor[mt_rand(0, count($nabor)-1)];    
}

Автор: InfMag 24.12.2007, 16:46
skyboy, а почему следует через mt_srand() инициализировать и каким образом?

Добавлено через 4 минуты и 45 секунд
skyboy,        Версия PHP    4.4.7
Код

    function genpass($symbols=6, $numbers=1, $lowers=1, $uppers=1)
    {
        $chars = ''; $result = '';
        if ($numbers == 1) $chars .= '0123456789';
        if ($lowers == 1) $chars .= 'qwertyuiopasdfghjklzxcvbnm';
        if ($uppers == 1) $chars .= 'QWERTYUIOPASDFGHJKLZXCVBNM';
        for ($i=0; $i<$symbols; $i++) $result .= substr($chars, mt_rand(0,strlen($chars)-1), 1);
        return $result;
    }

Вот так прошло, через strlen()
+1

Автор: skyboy 24.12.2007, 17:01
Цитата(InfMag @  24.12.2007,  15:46 Найти цитируемый пост)
 а почему следует через mt_srand() инициализировать и каким образом?

Цитата

Note: Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.

cмысл в том, что если бы инициализация была необходима, но не проводилась(т.е. для РНР версией до 4.2.0), то рпи разных запусках mt_rand выдавал бы одно и то же число(в пределах разных сессий). так как числа являются http://ru.wikipedia.org/wiki/Псевдослучайная_последовательность, то последовательности при совпадающих значениях параметров будen совпадать. и без инициализации ты бы получал один и тот же набор чисел от запуска к запуску. но твоя версия РНР производит инициализацию автоматически проблем в этом отошении быть не должно.

Автор: Mal Hack 24.12.2007, 21:52
Код
<?php

 function generate_pass( $m )
  {
   $pass = "";

   for( $i = 0 ; $i < $m ; $i++ )
    {
     $te = mt_rand( 48 , 122 );

     if( ( $te > 57 &&  $te < 65 ) || ( $te > 90 &&  $te < 97 ) )
      {  $te = $te - 9;  }

     $pass .= chr( $te );
    }

   return $pass;
  }

 print generate_pass( 32 );

?>

Автор: BASILIO 24.3.2008, 17:51
Жесть, народ, зачем так мучатся? =)

Код

$newpswd = substr(md5(time()),8,8);


 smile 

Автор: bars80080 24.3.2008, 18:27
а затем, чтобы пароль был не просто случайным, а случайным в диапазоне определённых символов
либо только латиница,
либо латиница в нижнем регистре,
либо латиница и цифры

и т.д.

Автор: BASILIO 24.3.2008, 18:40
bars80080, 
логично, только вопрос, а оно надо? ;) Ту абракадабру что выдаёт мд5 спокойно можно под пароли юзать =)

Автор: bars80080 24.3.2008, 18:53
товарищ BASILIO, вы можете предсказать все возможные вероятности, в кот. вам потребуются генератор случайных паролей?

я вот к примеру сталкивался с тем, что нужно получить кодовое слово определённой длины, начинающееся исключительно с маленьких латинских букв, а дальше цифры и латиница в любом регистре

с помощью функции выше, можно это реализовать, а md5 поможет?

я уж не говорю о вставке кириллицы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)