random

Тема в разделе ".:: Готовые решения", создана пользователем Slayter, 24 ноя 2007.

Статус темы:
Закрыта.
  1. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    575
    Затем, что класс лучше в плане расширяемости...

    И управляемость классом выше. Ибо для того, чтобы убрать группу символов, которые не нужны - в вашем случае нужно менять код. А в моем - просто не вызывать метод ;)
     
  2. medvoodoo

    medvoodoo Постоялец

    Регистр.:
    28 мар 2007
    Сообщения:
    88
    Симпатии:
    19
    к предыдущим постам: перед array_rand необходим shuffle($ArrayP); т.к. срез массива берется подряд!!!!
    Что меня не устраивает в вашем классе:
    1) необходимость создания нескольких экземпляров с разными параметрами. без возможности их переопределить
    2)Получающийся большой текст вызова, учтем, что действие достаточно специфическое :)
    чтобы просто так не критиковать написал рабочий готовый класс. я думаю почти final:
    PHP:
    <?php
    /**
     * CREATE RANDOM STRING
     *
     * @package nulled.ws 
     * @author Medvoodoo
     * @copyright Medvoodoo
     * @version 0.1 a
     * 
     */
    class crs
    {
        
    /**
         * Статический метод предназначен для генерации ключей
         * 
         * $Type варианты ключей, мжет использоваться несколько подряд: 
         * c - [a-z]
         * C - [A-Z]
         * d - [0-9]
         * a - [A-z]
         * A - [A-z][0-9]
         *
         * @param integer $Num кол-во символов
         * @param string $Type какой набор символов использовать
         * @param unknown_type $Repeat сколько раз может повторяться символ
         * @param unknown_type $ArrayS дополнительные символы
         * @return string результирующий ключ
         */
        
    static function create($Num,$Type,$Repeat 1,$ArrayS = array())
        {
            
    $ArrayP = array();//результирующий массив
            
            
    $Type "_".$Type;//для скорости        
            
    while($Repeat)
            {
                
                if(
    strpos($Type,"c")) $ArrayP array_merge($ArrayPrange("a","z"));//для маленьких букв
                
    if(strpos($Type,"C")) $ArrayP array_merge($ArrayPrange("A","Z"));//для больших букв
                
    if(strpos($Type,"d")) $ArrayP array_merge($ArrayPrange("0","9"));//для цифр
                
    if(strpos($Type,"a")) $ArrayP array_merge($ArrayPrange("A","z"));//для всех символов диапазона A-z
                
    if(strpos($Type,"A")) $ArrayP array_merge($ArrayPrange("A","z"), range("0","9"));//для всех символов включая цифры
                
    $ArrayP array_merge($ArrayP,$ArrayS);//добавляю
                            
    $Repeat--;
            }
            
    shuffle($ArrayP);
            return 
    implode("",array_rand(array_flip($ArrayP),$Num)); 
        }
    }
    //примеры
    print "5 символов [a-z][A-Z] без повторений :".crs::create(5,"cC")."<br>";
    print 
    "6 символов [0-9] возможны 2 повторения :".crs::create(6,"d",2)."<br>";
    print 
    "10 символов [A-z][0-9](АБВ) возможны 4 повторения :".crs::create(10,"A",4,array("А","Б","В"))."<br>";
     
    Jeurey нравится это.
  3. roddik

    roddik Колбаска

    Регистр.:
    26 янв 2007
    Сообщения:
    351
    Симпатии:
    290
    случаем с array_slice не перепутал?;)
     
  4. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    575
    А вот тут уже скажу "ЗочеД"... Это ближе к телу :)

    Только одно пожелание - for заменить на foreach - так красивше :)
     
  5. medvoodoo

    medvoodoo Постоялец

    Регистр.:
    28 мар 2007
    Сообщения:
    88
    Симпатии:
    19
    roddik не перепутал, в пхп 5.2 обнаружил такой косяк, что срез массива не рендомом берет.
    Jeurey Исправил на while :) он быстрее и на одну переменную меньше
     
  6. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    575
    Йа тесты проводил :) foreach быстрее в пределах 1000 итераций :)
     
    medvoodoo нравится это.
  7. medvoodoo

    medvoodoo Постоялец

    Регистр.:
    28 мар 2007
    Сообщения:
    88
    Симпатии:
    19
    Исправил для ускорения.
    Спасибо за дельные замечания Jeurey
    Теперь FINAL
     
  8. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    medvoodoo, чисто ради приличия, воткни в класс конструктор и деструктор :) .
     
  9. medvoodoo

    medvoodoo Постоялец

    Регистр.:
    28 мар 2007
    Сообщения:
    88
    Симпатии:
    19
    чисто ради приличия класс содержит ТОЛЬКО статические элементы, но можно воткнуть что нибуть типа
    PHP:
    private __construct(){}
    это не ошибка :)
     
  10. fuck0ff

    fuck0ff Постоялец

    Регистр.:
    2 сен 2007
    Сообщения:
    92
    Симпатии:
    50
    Вот как-то недавно наковырял:

    PHP:
    function genPasswd $length )
    {

        
    $charlist array_diff(range(65122), range(9097));

        
    shuffle($charlist);

        
    $charlist array_slice($charlist0$length);

        
    $charlist array_map('chr'$charlist);

        
    $charlist join(''$charlist);

        return 
    $charlist;

    }
    можно ещё расширить функционал для исключения/включения нужных символов :)
     
Статус темы:
Закрыта.