Генерирование pin кода

hohoho

Новичок
Генерирование pin кода

Здравствуйте!
Я написал скрипт генерирования пин кодов. Но почему-то он больше чем 15729 записей не генерирует. Сообщения о макесимальном времени выполнении скрипта не появляется, но что бы я не делал больше чем это число сгенерировать не получается может быть какие-то ограничения накладывает mysql? Или я что-то криво написал??? Подскажите пожалуйста
PHP:
<?
require_once ('./source/db.inc');
function generate_pin()
{
        $pin_lenght = 10;
        $pin = '';
        for( $length = 0; $length < $pin_lenght; $length++ )
        {
                $char = rand( 48, 122 );
                if (($char >= 48 && $char <= 57) || ($char >= 97 && $char <= 122))
                {
                        $pin .= chr($char);
                }
                else
                {
                       $length--;
                }
        }
        return $pin;
}

function check_pin_exist($pin)
{
        global $db;
        $query = "SELECT * FROM cards WHERE pin = "."'".$pin."'";
        $result = $db->query($query);
        if ($db->affectedRows() == 1)
        {
                return true;
        }
        else
        {
                return false;
        }
}

function write_pin($pin)
{
        global $db;
        $query = "INSERT INTO `cards` ( `pin` , `active` , `user` , `date` )VALUES ('".$pin."', '0', 'nil', '0000-00-00 00:00:00')";
        $db->query($query);
}

for ($i = 0; $i < 20000; $i++ )
{
        $pin = generate_pin();
        if (!check_pin_exist($pin))
        {
                write_pin($pin);
        }
        else
        {
                $i--;
        }
}
?>
 

bgm

&nbsp;
Собственно проблема - в псевдогенераторе случайных числе rand() - это можно заметить, если выполнить следующий код:
PHP:
$rout = Array(); $max = 20000; $s = 0;
while ($s<$max) :
	$pin = generate_pin();
	$rout[$pin]=@$rout[$pin]+1;
	$s = sizeof($rout);
	echo $s." ".$pin." ".$rout[$pin]."<br>";
endwhile;
т.е. именно с 15729 пошло исчерпание таблицы и зацикливание.
Если заменить rand() на mt_rand() - всё налаживается.

P.S. Сам генератор пин-кода - ужасен. Плюс совершенно некрасивая проверка через базу данных.

P.P.S. Посмотри на http://ru2.php.net/mt_rand - в комментах есть реализация генерации строки символов.
 

hohoho

Новичок
Амна, а можно поподробнее на счёт ужастности? я просто ещё только учусь, поэтому мне бы побольше информации для размышления.
 

bgm

&nbsp;
а можно поподробнее на счёт ужастности?
Строго говоря - "ужас" имеет отношение не к PHP, а к программированию (конкретно - к алгоритмам) вообще. Т.е. это действительно вопрос теории и учёбы. Можно порекомендовать почитать Д.Кнута "Искусство программирования". Изучать примеры кода.

Что касается конкретно pin-кода: вот пример более быстрой и правильной функции генерации случайного пин-кода из заданного диапазона символов (числа и латиница)
PHP:
function generate_pin($pin_lenght) {
   // Маска
   $pin_mask = "0123456789abcdefghijklmnopqrstuvwxyz";
   // Длина маски
   $range = 36;
   $pin = ''; 

   for( $x = 0; $x<$pin_lenght; $x++ )
      { $pin.=$pin_mask[mt_rand(0,$range-1)];   } 

   return $pin; 
}
Естественно, что маску можно вынести за пределы функции и обращаться к ней как к глобальной переменной, можно передавать её в параметрах и т.д. Можно исключить лишнюю операцию - декремент длины маски, а задать её заранее. Т.е. простор для творчества :)
 
Сверху