1. PHP / Говнокод #4875

    +163

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    function generate_password($number) {
        $arr = array('a','b','c','d','e','f',
                     'g','h','i','j','k','l',
                     'm','n','o','q','p','r','s',
                     't','u','v','w','x','y','z',
                     'A','B','C','D','E','F',
                     'G','H','I','J','K','L',
                     'M','N','O','Q','P','R','S',
                     'T','U','V','W','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;
    }

    И ведь не лень всё перечислять было?! А по{man}'ить Array-функции лень... И написать что-то типа, хм...
    $alnum_ar = array_merge(range('a','z'),range('A','Z' ),range(0,9));
    array_push($alnum_ar,'_');

    Запостил: dwinner, 09 Декабря 2010

    Комментарии (65) RSS

    • Здесь вообще массив не нужен, хватит и строки, намного быстрее.

      function generate_password($number) {
          $arr = 'abcdefghijklmnoqprstuvwxyz0123456789';
          $pass = '';
          for ($i=0; $i<$number; $i++) {
            	$index = rand(0,strlen($arr)-1);
            	$pass .= $arr[$index];
          }
          return $pass;
      }
      Ответить
      • Да я вообщем-то в курсе, что строку можно использовать в контексте массива, но вы собственно тоже начали перечислять алфавит...
        Ответить
        • а вопрос производительности вы не ставите в принципе?
          Ответить
          • оптимизацию производительности надо начинать с уменьшения названия переменных. Если вместо $number написать $n, то интерпретатор отработает быстрее.
            Еще полезно убрать все ненужные пробелы. Форматирование конечно пострадает, зато файл будет меньше весить, с большей вероятностью застрянет в кеше винта.
            Ответить
            • Убивать надо тех кто проводит оптимизацию обфусцированием кода.
              код должен быть в первую очередь читабельным, а для опкода длина переменных роли не играет или вы всё еще не используете опкод кеш?
              Ответить
              • Вы иронии не заметили?

                я просто люблю, когда пыхапешники рассуждают об оптимизации)
                Ответить
                • на еще один пыхо-лулз недавно указали:
                  Many parsers generate an abstract syntax tree or parse tree that can then be manipulated or optimized before being passed to the code generator. The Zend Engine parser combines these steps into one and generates intermediate code directly from the tokens passed to it from the lexer.

                  пыхеры неасилили даже AST и тем более оптимизирующие проходы. так что ни о каких оптимизациях в пыхоговне и речи нет.
                  Ответить
                  • есть APC, есть eaccelerator, есть xcache. есть достаточно чтобы парсер не работал многократно.
                    а дальше - дело разраба как он читает маны и составляет алгоритмы.
                    Ответить
                    • почему он составляет алгоритмы в рабочее время?
                      Ответить
                    • да ладно, не оправдывай говнокодеров зенда.
                      с подачи ГК почитал бложик Расмуса - банальная двуличная шавка.
                      Ответить
                    • дада
                      надо все делать руками и сторонними продуктами
                      хочешь не перепарсивать по 20 раз?
                      пожалуйте в еакселератор
                      хочешь держать объекты в памяти?
                      пожалуйте в мемкеш
                      хочешь делать что-то в фоне?
                      пожалуйте в крон
                      хочешь мапить урлы?
                      пожалуйте в мод_реврайт

                      все приложение -- набор кучи костыликов и перемычичков

                      манифест пыховца: к черту фреймворки
                      я все на коленке сделаю
                      Ответить
                      • толсто, аноним.
                        пхп сам по себе сборище расширений пользующих все что сдеано сторонними руками. и что?
                        а зенд рулит и педалит. и солар тоже. не надо ляля.
                        Ответить
                        • Это не толсто. Это слова автора пхп.
                          Я привел Вам 3 примера того, когда в ПХП надо использовать костыль.
                          Вы, полагаю, с ними согласны, верно?
                          Ответить
            • Могу сказать с уверенностью, что на создание массива php тратит раз в 100 или 1000 больше времени, чем если переменная будет на 2-3 символа длиннее.

              P.S. А строка работает наверно быстрее чем массивы раз в 10. А на счет опкода, пхп хранит название переменных, и иногда вычисляет хеш от названия переменной, естественно вычислять хеш от длинных названий дольше, но это такая мелочь по сравнению с остальным кодом.
              Ответить
              • кода, где создание массива является боттлнеком, не существует в природе.
                Ответить
          • Вообще с точки зрения архитектуры оба способа неправильные ибо это хардкод.
            Вот над чем стоит подумать:
            - если надо поменять список доступных символов, будете лезть в код функции?
            - если понадобиться генерировать пароли разным набором символов, будете копипастить методы, т.е. generate_password, generate_strong_password, generate_very_strong_password_with_russi an_symbols и т.д.?
            Ответить
          • По вашему операция индексации строки как массива намного быстрее?
            Ответить
            • Да, а также объявление строки вместо массива. Ну блин, что стоит проверить.
              Ответить
    • Угу, про оптимизацию значит... Тогда лучше пароли из словаря брать, безопасность тогда пострадает... $n - крайность по-моему. Если количество символов в названии переменной не превысило семь символов и не потеряло информативность, то мы достигли т.н. золотой середины ($num). Чёрт, web-серверы не передают серверные скрипты по сети, он с вводом/выводом работает, неужели вы заметите прирост производительности?!
      Ответить
      • да вот объясните им, что у них 60% времени скрипт ждет ответа от MySQL, еще 20% времени ответ по сети передается пользователю, а они боятся что массив будет у них тормозить)
        Ответить
        • А вдруг они решили сгенерировать новые пароли для всех пользователей, а их там 20000 или более...
          Ответить
      • Всем оптимизаторам посвящается...
        1) Укоротить название функции, например MakePass!
        2) Вынести строку с символами в heap-memory (global scope)
        3) В строке для генерации перечислить все видимые ASCII (чтоб
        никто не выё.., что символом мало для генерации паролей), лучше вручную,
        конечно (опмитизатор в гору не пойдёт... гы гы)
        4) strlen вызвать один раз перед циклом, а не $num-раз в цикле!
        5) $i инициализировать перед циклом for, а блок инициализации for оставить пустым;
        6) Имена переменных делать по возможности меньшими, чтобы внутреннюю таблицу
        символом пощадить, да и вообще переменных поменьше.
        7) В конце, byte-код из всего полученного сделать
        Ответить
        • 4) - правильно
          1) 2) 3) 4) 6) - задротство.
          А. еще вернее будет насрать на все и взяв диапазон ASCII по номерам + рандом + цикл составлять пароли. и не вые....ся :)

          $i = 0;
          $passwd = '';
          for($i = 0;$i < 8; $i++){
          $passwd = sprintf('%s%c', $passwd, rand(33, 126) );
          }

          вот таким гавнокодом например :)
          Ответить
          • > 4) - правильно
            > 1) 2) 3) 4) 6) - задротство.
            4 === правильное задротство?
            Ответить
            • но задротсво же. апичатался. исправлять не буду )
              Ответить
          • Конечно, конечно, задротство, но работает быстрее...
            Ответить
    • ВСЕМ МЕГА-ОПТИМИЗАТОРОМ, (если уж на то пошло...): в первую очередь вы бы не про массивы и строки дискуссии вели бы, а вынесли всё нахрен в глобальную область памяти, чтобы массив или строка (что кому угодно) читались бы из кучи, а не из стека. Вы бы ещё все кэширующие решения перечислили!
      Ответить
    • БыдлоПсевдоГенераторщикПаролейПехапэпер детектед.
      Ответить
      • Наверно, кто это писал, уже запатентовал подобное название ))))))
        Ответить
    • как насчет
      uniqid();

      и его вариаций?
      Ответить
      • Можно, конечно, но хотелось бы взять под полный контроль длину пароля
        Ответить
      • чото там фраза в мане "more unique" какбы намекает на говно.
        это как - уникальный, еще уникальнее, еще более уникальная уникальность? ппц :-D
        Ответить
        • http://ru.php.net/uniqid
          там еще внизу жесткие примеры идут.
          $unique = md5( uniqid() ); // 32 characters long

          уникализация. ога.
          Ответить
          • )))надо еще 8 раз мд5 вызвать
            что бы для надежности

            я же говорю: когда пхпшники говорят -- петросяны молчат)
            Ответить
            • мд5 не инъективное отображение. в нем не обязательно md5($a) == md5($b) при $a!=$b
              //ойбля. пишу матан пхпшным синтаксисом. ну пиздец.
              Ответить
              • Капитан Очевидность мне подсказывает, что чуть более, чем половина блоков, размер которых превышает размер ключа (то есть 128 бит = 16 байт для MD5), имеют одинаковую криптографическую сумму.

                Даже статьи написаны о столкновениях в хэш-функциях:
                http://eprint.iacr.org/2004/199
                http://eprint.iacr.org/2004/264
                http://eprint.iacr.org/2006/105
                http://cryptography.hyperlink.cz/MD5_collisions.html
                Все ссылки из Википедии.
                Ответить
              • Понятно. Шутки юмора мы не замечаем)
                Ответить
    • Алфавит, если что, набирается на клавиатуре с раскладкой QWERTY секунды за полторы-две максимум.
      Ответить
      • Кто в основном тексты печатает, а не программы пишет, наверно так и думает.
        P.S. Прошу прощения за троллинг, не удержался. ;-)
        Ответить
        • ну так никто не заставляет их по 1) алфавиту долбить 2) если пара буков пропадет - на крутости пароля не скажется.
          да, несколько секунд
          qwertyuiopasdfghjklzxcvbnm
          Ответить
          • на кверти достаточно проскользить (если слим-клавиатура) пальцем/прыгнуть восемью пальцами на три ряда.

            http://typingzone.com/?page=contest_az
            http://typingzone.com/?page=contest_za
            набор на клаве в порядке 1)abcdefghijklmnopqrstuvwxyz; 2) zyxwvutsrqponmlkjihgfedcba.
            извините, но я умею как программировать, так и набирать на клавиатуре очень быстро, простите за занудство
            Ответить
            • "программировать очень быстро".
              хм.
              и что даже чайку не попьете над проектированием не задумываетесь долго?
              Ответить
            • трёмя пальцами одно движение
              qazwsxerdcftvbgyunhjmikolp
              с 5й попытки получился алфавит
              Ответить
              • Уж лучше тогда одним пальцем в три движения.
                Ответить
                • Одно движение быстрее, чем три.
                  Ответить
                  • Быстрее сесть попой на клавиатуру, но где гарантия, что там получится алфавит, а не имя основателя Международного общества сознания Кришны.
                    Ответить
                    • как насчет PNRG на базе ноутбука и кошки?
                      Ответить
                    • Одно движение 3 пальцами ничуть не менее надёжно, чем три движения одним.

                      (я про набор алфавита)
                      Ответить
                    • В его имени всего только буквы "а, б, в, д, е, и, й, к, м, н, п, р, с, т, у, х, ч", что около половины символов русского алфавита. Судя по расположению на клавиатуре, такое имя просто так нажать нетривиально.
                      Ответить
                      • Но речь шла о латинском алфавите. А на нем это имя охватывает аж 70% латиницы.
                        Ответить
                        • Моя вина, каюсь. Не подумал. Но у них алфавит короче!
                          Ответить
            • ойблин, идите на клавогонки.ру, там любят таких клавиатурщиков
              Ответить
    • Внимание!
      $alphabet = '';
      for($char = 'a'; $char < 'z'; $char++){
      $alphabet .= $char;
      }
      Ответить
      • Развивая дальше мысль, так можно весь видимый ASCII в одну строку
        запихнуть, но об этом-то уже был коммент! Так, что Внимания у кого-то
        не хватило.
        Ответить
      • my $alphabet = join ('', 'a' .. 'z');
        *trollface*
        Ответить
    • я хотела буквально всё - хотела попробовать член, отдаться в киску и всё такое. Я очень часто плакала когда была дома, по этому поводу, потому что желания и секс - фантазии буквально разрывали мой мозг, и только когда я мастурбировала, организм успокаивался и затихало на время дичайшее желание.
      Ответить

    Добавить комментарий