[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Генератор паролей
Han
есть скрипт генератора паролей

PHP
<form method=post>

<
input type=text name=number value="10">

<
input type=submit value="Генерировать">

<
form><br><br>

<?
php

  
// Параметр $number - сообщает число 

  // символов в пароле

  echo generate_password($_POST['number']);



  function generate_password($number)

  {

    $arr = array('a','b','c','d','e','f',

                 'g','h','i','j','k','l',

                 'm','n','o','p','r','s',

                 't','u','v','x','y','z',

                 'A','B','C','D','E','F',

                 'G','H','I','J','K','L',

                 'M','N','O','P','R','S',

                 'T','U','V','X','Y','Z',

                 '1','2','3','4','5','6',

                 '7','8','9','0','.',',',

                 '(',')','[',']','!','?',

                 '&','^','%','@','*','$',

                 '<','>','/','|','+','-',

                 '{','}','`','~');

    // Генерируем пароль

    $pass = "";

    for($i = 0; $i < $number; $i++)

    {

      // Вычисляем случайный индекс массива

      $index = rand(0, count($arr) - 1);

      $pass .= $arr[$index];

    }

    return $pass;

  }


Вот не могу понять зачем когда присваивают переменной $index случайное число от 0 до последнего индекса масива , после count($arr) ставят -1????

Не могу понять хоть стреляй.

если -1 убрать то когда задаёш в форме сгенерировать 10 символов генерирует беспорядочное количество символов. Может 8 может 9 может 7.



Спустя 3 минуты, 54 секунды (3.05.2009 - 01:30) Joker написал(а):
Потомучто отсчет в масиве начинаеться не от 1 а от 0 и по этому последний элемент масива будет не количеством всех элементов в миссиве.

Спустя 6 минут, 15 секунд (3.05.2009 - 01:36) Han написал(а):
И если можеш обьясни плиз почему если убрать -1 то когда задаёш в форме сгенерировать 10 символов генерирует беспорядочное количество символов. Может 8 может 9 может 7.

Спустя 16 минут, 43 секунды (3.05.2009 - 01:53) Joker написал(а):
дак оно полюбому случайно генерирует но если вдруг выпадет значение равноу count то тогда из массива возметься пустота т.к. такова элемента нету.

Спустя 3 минуты, 26 секунд (3.05.2009 - 01:56) Han написал(а):
ггг спасибо я в принцыпи так и думал просто почему усомнился. У меня из 10 символов разок даже 5 напечатало. Тоесть мне слабо поверилось , что вероятность выпадание последнего индекса которого не сушествует 50% потому что элементов в масиве много!

Спустя 7 минут, 1 секунда (3.05.2009 - 02:03) Han написал(а):
Вот еще вопрос если не тяжело покажи мне ошибку плиз. Так жалко старался писал ,а оно не пашет зараза.

Короче я решил дописать этот скрипт и зделать так чтоб в згенерируемом коде небыло повторяющихся символов. Для максимальной наглядности я оставил 10 символов в масиве. Чтобы сгенерировав 10 символов были задействованны все по одному разу.

И так скрипт

PHP
<form method=post>

<
input type=text name=number value="10">

<
input type=submit value="Генерировать">

<
form><br><br>

<?
php

  
// Параметр $number - сообщает число 

  // символов в пароле

  echo generate_password($_POST['number']);



  function generate_password($number)

  {

    $arr = array('a','b','c','d','e','f',

                 'g','h','i', 'j' );



    // Генерируем пароль

    $pass = "";

    for($i = 0; $i < $number; $i++)

    {

      // Вычисляем случайный индекс массива

      $index = rand(0, count($arr)-1);
      
       

       for 
(;;)
      
       
{
      
        
// Проверяем есть ли сгенерированный символ ($index) в  строке ($pass)

        $proverka = strpos($pass,$arr[$index]);
        if ($proverka > 0) 
        
{
         $index = rand(0, count($arr)-1);
         continue;
        }
         else
         
{
          $pass .= $arr[$index];
          break;
         }
       }
       

    
}


    return $pass;

  }

Спустя 11 минут, 13 секунд (3.05.2009 - 02:14) Joker написал(а):
Цитата (Han @ 2.05.2009 - 23:03)
$arr = array('a','b','c','d','e','f',

'g','h','i', 'j', [s]);


это что такое?)
Цитата
, [s]


Спустя 9 минут, 19 секунд (3.05.2009 - 02:24) Han написал(а):
Оно само припаяло я туда этого не ставил вобщем я отредактировал теперь такой же как и у меня сейчас в блакноте. Сам скрипт работает, только моя задумка о реализации генерации 10 символов без повторения не работает!

Спустя 1 час, 21 минута, 4 секунды (3.05.2009 - 03:45) Joker написал(а):
ты немного не так проверяешь массив... вечерком дам функцию а пока думай). скажу сразу используй функцию while

Спустя 4 часа, 22 минуты, 31 секунда (3.05.2009 - 08:07) twin написал(а):
Мудрите вы братцы. Всё гораздо проще:
PHP
<?php
function rand_str($num
{  
    
$arr range("a","z");  
     
shuffle($arr);
    
$str implode("",$arr);
return    
substr($str,0,$num);

}

echo 
rand_str(10);
Только учти, что букв в алфавите всего 26 и пароль длинной больше 26 символов не получится, или тогда они будут повторяться.

Спустя 3 часа, 42 минуты, 4 секунды (3.05.2009 - 11:49) Han написал(а):
Цитата
Мудрите вы братцы. Всё гораздо проще:


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

PHP
for (;;)
      
       {
      
        
// Проверяем есть ли сгенерированный символ ($index) в  строке ($pass)

        
$proverka strpos($pass,$arr[$index]);
        if (
$proverka 0
        {
         
$index rand(0count($arr)-1);
         continue;
        }
         else
         {
          
$pass .= $arr[$index];
          break;
         }
       }


всё же тоже придельно просто! Просто решил попрактиковаться чуток знания у меня слабоватые и всё вроде бы правильно и не работает обидно блин sad.gif


Плиз кто может обьясните почеу не работает?

Спустя 37 минут, 40 секунд (3.05.2009 - 12:27) twin написал(а):
Ну давай по порядку.
1. Что бы избежать ошибки, нужно приводить входящие данные к числовому типу. Иначе может случайно попасть буква и будет нотис:
PHP
echo generate_password(intval($_POST['number']));

2. Вот тут ты поступил не оптимально:
PHP
$index = rand(0, count($arr)-1);

ты вызываешь функцию count() в цикле, а она считает один и тот же массив. Достаточно сосчитать его один раз за циклом:
PHP
$count count($arr)-1;
    for(
$i 0$i $number$i++)
    {
      
// Вычисляем случайный индекс массива
      
$index rand(0$count);

А вот тут наоборот,функцию нужно вызывать каждый раз и совсем не обязательно записывать результат в переменную. И проверку нужно делать немного не так:
PHP
if (strpos($pass,$arr[$index])!== false) 
        
{
         $index = rand(0, count($arr)-1);
         continue;
        }

Спустя 2 часа, 17 минут, 7 секунд (3.05.2009 - 14:44) Joker написал(а):
я тож незнал о этихфукциях)
range
shuffle

Но я функцию написал без их знания)))

Спустя 23 минуты, 59 секунд (3.05.2009 - 15:08) Han написал(а):
twin

1. Зделал всё как ты посоветовал. Собственно структура алгоритма ничем не меняеться. тоесть получился код

PHP
<form method=post>

<
input type=text name=number value="10">

<
input type=submit value="Генерировать">

<
form><br><br>

<?
php

  
// Параметр $number - сообщает число 

  // символов в пароле

  echo generate_password(intval ($_POST['number']));



  function generate_password($number)

  {

    $arr = array('a','b','c','d','e','f',

                 'g','h','i' );



    // Генерируем пароль

    $pass = "";

    $count= count($arr) - 1;

    for($i = 0; $i < $number; $i++)

    {

      // Вычисляем случайный индекс массива

      $index = rand(0, $count);
      
       

       for 
(;;)
      
       
{
      
        
// Проверяем есть ли сгенерированный символ ($index) в  строке ($pass)

        
        if 
(strpos ($pass,$arr[$index]) !== false)
        {
         $index = rand(0, $count);
         continue;
        }
         else
         
{
          $pass .= $arr[$index];
          break;
         }
       }
       

    
}


    return $pass;

  }


Но он увы не работает.

Ошибка

Fatal error: Maximum execution time of 30 seconds exceeded in Z:\denwer\www\denwer\index.php on line 54

Не понимаю , что не так.


2. почему имено в строчке

PHP
if (strpos($pass,$arr[$index])!== false)


используеться !== (тоесть если не равно и разные по типам?) я попробовал != false и попробовал != 0 оба последние работают только буквы при генерации почему то повторяються

3. в строке echo generate_password(intval ($_POST['number'])); (так как я

такой формы записи не знал ) можно ли использовать settype тоесть будет

PHP
(settype (($_POST['number']), intval ))


или например i$= (intval) i$

Спустя 1 час, 49 минут, 33 секунды (3.05.2009 - 16:58) twin написал(а):
Чесно говоря лениво и некогда комментировать такой безобразный код. Займись лучше чем нибудь действительно полезным, чем пытаться слепить из г конфетку.

Спустя 6 часов, 25 минут, 12 секунд (3.05.2009 - 23:23) Han написал(а):
Цитата
Чесно говоря лениво и некогда комментировать такой безобразный код. Займись лучше чем нибудь действительно полезным, чем пытаться слепить из г конфетку.



Для меня он нормальный я ж еще новичёк. И не дело в том, что мне очень нужно реализовать генератор паролей именно таким способом, просто цепляет то что я вроде написал всё правльно , а он не работает так как нужно и при этом я не могу найти ошибку!

Спустя 7 минут, 45 секунд (3.05.2009 - 23:30) Joker написал(а):
Цитата (twin @ 3.05.2009 - 13:58)
Чесно говоря лениво и некогда комментировать такой безобразный код. Займись лучше чем нибудь действительно полезным, чем пытаться слепить из г конфетку.


Вот бы посмотреть какие ты коды лепил когда начинал изучать программирование)) tongue.gif

Спустя 9 минут, 2 секунды (3.05.2009 - 23:40) twin написал(а):
Я не то имел ввиду вовсе. Я имел ввиду то, что не нужно тратить время на скрипт, который
1. не имеет практического применения
2. решен более оптимальным способом.
Время, потраченное на разбор завалов и упрямое - заставлю любой ценой, можно гораздо эффективнее потратить, решая другие задачи.
А код у меня в начале деятельности был таким, что не приведи господь кому увидеть. Только я старался смотреть как делают другие, а не упирался по нескольку дней в ненужные скрипты.

Спустя 3 минуты, 40 секунд (3.05.2009 - 23:43) Joker написал(а):
Я бы наоброт сказал бы что нужно разобрать скрипт т.к. нужно понять как работает без этих функций. Как мне сказала учительница по алгебре "Не возможно знать всех форумул. Но нужно уметь их выводить из оснвных." Тоже самое в php если не знать все функции то нужно уметь сделать аналогичную свою функцию.

Спустя 37 минут, 46 секунд (4.05.2009 - 00:21) twin написал(а):
Ну щас научишь, блин. На кой пыхтеть и сочинять свою функцию, когда есть штатная. Лучше матчасть учить. А php это не матиматика, тут всего то тыщи три функций, из них активно используется меньше половины. А учительница твоя не права. Нам всегда говорили в институте - мы не заставляем вас зубрить все формулы, мы учим работать со справочниками. Не нужно изобретать велосипедов. Если нужен пароль, представь простейший алгоритм, как бы ты сделал и го в мануал. Там наверняка есть всё, что для этого нужно.

Спустя 6 часов, 50 минут, 18 секунд (4.05.2009 - 07:11) Kuliev написал(а):
Han

Вот еще пример, правдо он не намного отличается от примера twin, но все же для общего развития.
PHP
// количество выводимых символов
$numbers 4;

// Массив цифр, можно и буквы добать
$number = array (0,1,2,3,4,5,6,7,8,9);

// Прогоняем цикл 4 раза
for ($i 0$i $numbers$i++)
{

// Шафлим массив и берем из него нулевой  элемент
shuffle($number);

// создаем другой масив с выбранными элементами (цифрами)
$str[] = $number[0];
}
// Переводим массив в строку
$str_number implode('',$str);


Спустя 32 минуты, 39 секунд (4.05.2009 - 07:44) kirik написал(а):
Ну тогда для общего развития функция, которой пользуюсь я smile.gif

PHP
/**
 *    NOTE Random string generaton function
 *    (str) random_name($length, $type)
 *    $length  - length of string   @def=11
 *    $type    - a-z, A-Z, 0-9      @def=a-zA-Z0-9
**/
function RandomName($length=11, $type='a-zA-Z0-9')
{
    $return = $chars = null;

    if(strstr($type, 'a-z'))
        $chars .= 'abcdefghijklmnopqrstuvwxyz';
    if(strstr($type, 'A-Z'))
        $chars .= 'ABCDEFGHIJKLMNOPRQSTUVWXYZ';
    if(strstr($type, '0-9'))
        $chars .= '0123456789';

    for($i = 0, $sl = strlen($chars) - 1; $i < $length; $i++)
        $return .= $chars[rand(0,$sl)];

    return $return;
}



А вообще
Цитата (twin @ 3.05.2009 - 16:21)
На кой пыхтеть и сочинять свою функцию, когда есть штатная.

для генерации паролей uniqid() подойдет на все 100.

Спустя 2 часа, 44 минуты, 25 секунд (4.05.2009 - 10:28) Guest написал(а):
Цитата
Ну щас научишь, блин. На кой пыхтеть и сочинять свою функцию, когда есть штатная. Лучше матчасть учить. А php это не матиматика, тут всего то тыщи три функций, из них активно используется меньше половины. А учительница твоя не права. Нам всегда говорили в институте - мы не заставляем вас зубрить все формулы, мы учим работать со справочниками. Не нужно изобретать велосипедов. Если нужен пароль, представь простейший алгоритм, как бы ты сделал и го в мануал. Там наверняка есть всё, что для этого нужно.


Понимаеш ли в чём дело. Я пытаюсь написать скрипт только из за спортивного интереса. Я решил дописать генератор паролей ине получилось (лажа). И я даже не могу понять почему не выходит и по этому я не могу двигаться дальше. Может мой скрипт и не качественный но он должен работать , а он не работает вот в чём дело!

Спустя 12 минут, 19 секунд (4.05.2009 - 10:41) kirik написал(а):
Цитата (Han @ 3.05.2009 - 07:08)
Но он увы не работает. Ошибка
Fatal error: Maximum execution time of 30 seconds exceeded in Z:\denwer\www\denwer\index.php on line 54


Ошибка означает примерно следующее "Максимальное время выполнения скрипта в 30 секунд превышено! (указан файл и строчка)". Пройдя по строчке ты увидишь свой цикл for (;;) (вероятно), и именно из-за него происходит такая ошибка - он выполняется бесконечно. Думай как поправить.

Спустя 33 минуты, 45 секунд (4.05.2009 - 11:14) Han написал(а):
Почему же for (;;) не бесконечен он выполняеться до тех пор пока не сгенерируеться уникальный символ. Сейчас проверил всё работает! По ходу я указывал число символов генерации больше чем их было в масиве!

Единственное что я не могу понять почему если сравнить оператором !== то работает всё нормально только с последним символом запара ,а если != то символы в генерируем пароле повторяються!


Тоесть в первом случае если strpos возрашяет число например 5 то 5 !== false;
всё правильно условие выполняеться 5 не равно лож и разные по типам, а если 0 то 0 !== false; 0 равно false и разные по типу.


Во втором то же самое! Если strpos возрашяет число например 5 то 5 != false;
всё правильно условие выполняеться 5 не равно лож , а если 0 то 0 != false; 0 равно false и разные по типу.

тоесть не вижу разницы

Спустя 15 минут, 33 секунды (4.05.2009 - 11:30) Гость_hara написал(а):
что не ясно то ?
нельзя быть таким ленивым, ну посмотри ты что возвращает функция strpos
и почему необходимо использовать именно !==

Спустя 32 минуты, 43 секунды (4.05.2009 - 12:03) Han написал(а):
Цитата
что не ясно то ?
нельзя быть таким ленивым, ну посмотри ты что возвращает функция strpos
и почему необходимо использовать именно !==


ГГ я сама ленивость ыыыыы.

Я и так помню . $index != $index если первое не равно второму то возвращяет true. $index !== $index если первое не равно второму и при этом у них разные типа возвращяет true.

strpos ищет указаный символ либо слово . В качестве параметров нужно указать

1. Где искать

2. что искать

3. с какого символа начинать поиск (параметр не обязателен по умолчанию

равен 0)

Поправь если я что то неправильно сказал!!!!!!!

Прочитай еще раз мой вопрос 4.05.2009 - 08:14 . Я даже коментировал использование !== и !=

Спустя 39 минут, 50 секунд (4.05.2009 - 12:42) twin написал(а):
Цитата
$index !== $index если первое не равно второму и при этом у них разные типа возвращяет true.
наоборот. только если типы одинаковы. Для того и "строго не равно"
А функция strpos() возвращает false в случае неудачного поиска. Потому и.

Спустя 47 минут, 47 секунд (4.05.2009 - 13:30) Guest написал(а):
хм
если типы разные и/или не они равны
возвращается true (вобщем и то и другое.. вместе)

Спустя 2 часа, 12 минут (4.05.2009 - 15:42) Han написал(а):
twin Спасибо тогда всё ясно я просто у меня кое что не дописано кое что просто небыло по этому я и запутался малёха((


_____________
Никогда не бойся делать то, что ты пока не умеешь. Помни, Ковчег был построен любителем. Профессионалы построили "Титаник".
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.