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

    +164

    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
    19. 19
    20. 20
    21. 21
    22. 22
    private static function getKey($len = 8)
     {
        global $db;
    
      $chars = 'QWERTYUIOPASDFGHJKLZXCVBNM0123456789';
      $key = '';
    
      for ($i = 0; $i < $len; $i++)
      {
       $key .= substr($chars, rand(1, strlen($chars)) - 1, 1);
      }
    
      if ($db -> select(
       'SELECT *
       FROM ' . self::$t_main .
       ' WHERE `key` = "' . $key . '"'))
      {
       return ModelTickets::getKey();
      }
    
      return $key;
     }

    "Генератор" уникального ключа.

    Автор кода когда-то хотел к нам на работу устроиться. Но всё как-то не срасталось, а потом другую работу нашёл. Я об этом долгое время жалел, но потом я нашёл вот этот код, за его авторством. И я понял, б-г есть, уберёг контору от страшного.

    Рекурсия по базе данных - это надо иметь особый склад ума.

    Запостил: Shitafaka, 10 Марта 2015

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

    • > хвостовая рекурсия
      Автор, видимо, с функцианальных языков пришёл.

      P.S. Кстати, после коллизии $len будет всегда 8. Не айс.
      Ответить
      • >>Автор, видимо, с функцианальных языков пришёл.

        А что, среди императивщиков знать рекурсию - моветон?
        Ответить
        • Нет, но среди императивщиков никто не рассчитывает на хвостовую рекурсию.
          Ответить
          • Какие ваши доказательства, что он специально хвостовую рекурсию?
            Ответить
            • Вера в человечество.
              Ответить
              • Какое-то слабоватое доказательство, учитывая решаемую задачу и инструмент.
                Ответить
      • Не страшно, ведь стек переполнится гораздо раньше.
        Ответить
        • Значит это фича. Если все айдишки уже заняты (или рандом кривоват), то цикл будет грузить сервер 30 секунд и ничего не добьется (или сколько там настроен таймаут запроса). А рекурсия очень быстро отвалится.
          Ответить
          • Так в итоге и произошло. 8 символов - это 32768 возможных вариантов. Когда это количество было достигнуто - сервер начал умирать.
            Ответить
            • > 32768
              Вай? pow(36, 8) = 2821109907456 же, если рандом хороший.
              Ответить
              • Да и точно. Но 32768 всё-же стало смертельным.
                Ответить
                • Щас посмотрел старые ревизии, $len было установлено в 5 в месте, вешающем сервер. Понятно, почему 32768
                  Ответить
                  • Не понятно ;) Там же не 8 букв, а аж 36. 60кк айдишек можно сгенерить из 5 символов.

                    Скорее 32768 вызовов - это лимит рекурсии в PHP.
                    Ответить
    • Всегда было интересно, зачем некоторые пыхомакаки генерят айдишники рандомом? Есть предположение, что это такая сео-петушня, мол, нахуй никому не нужен сайт, на котором всего 3.5 зарегистрированных пользователя, а вот получив после регистрации километровый айдишник сразу начинаешь думать, что жизнь на том ресурсе бьёт ключом.
      Ответить
      • Как по мне, то md5(microtime(true)) рулит.
        Ответить
        • > md5(microtime(true))
          Этакий недоGUID.
          Ответить
        • http://php.net/manual/ru/function.uniqid.php
          или http://php.net/manual/ru/function.mcrypt-create-iv.php - для тру секьюрных парней (для ключей нафиг не надо).
          Ответить
    • похопешник не слышал про uuid
      Ответить
      • Слышал

        http://php.net/manual/en/function.uniqid.php - но советую курнуть манул. Это немного не то, что хотелось бы.

        Там ещё в комментах есть 200-строчная хуйня для генерации юидов 4 версии. Но как по мне, то 200-строчная хуйня ради юида - это блядь пиздец.
        Ответить
        • > 200-строчная хуйня ради юида - это блядь пиздец
          Ага. В 2015 году генерация uuid'ов должна быть в стандартной либе.
          Ответить
          • Кстати, где мой коммунизм и город на марсе?
            Ответить
          • Это явно не путь разработчиков пхп. У php в SPL есть много всего, кроме того, что нужно. Лучше бы синтаксис выровняли.
            Ответить
        • "Shitafaka: Как по мне, то md5(microtime(true)) рулит."
          "Shitafaka: http://php.net/manual/en/function.uniqid.php - но советую курнуть манул. Это немного не то, что хотелось бы."
          "Мануал: uniqid — Получает уникальный идентификатор, основанный на текущем времени в микросекундах."
          Ответить
          • Внимание

            Эта функция не создает ни случайную ни трудно подбираемую строку. Нельзя использовать эту функцию в целях повышения безопасности. Используйте криптографически безопасные функции/генераторы случайных данных, и криптографически защищенные хэш-функции для создания непредсказуемых безопасных ID.
            Ответить
            • Ну так про md5(microtime(true)) то же самое можно сказать.
              Ответить
    • А может там супер коннектор к бд, который при пустой выборке возвращает фалсе!!! :-) ЫЫыыыыы
      Ответить
      • ну как бы пустая выборка вполне может сама по себе восприниматься как false
        Ответить

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