"PHP" / Говнокод #17757 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Shitafaka, (Updated )

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

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

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

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

                  Скорее 32768 вызовов - это лимит рекурсии в PHP.
                  Ответить
  • Всегда было интересно, зачем некоторые пыхомакаки генерят айдишники рандомом? Есть предположение, что это такая сео-петушня, мол, нахуй никому не нужен сайт, на котором всего 3.5 зарегистрированных пользователя, а вот получив после регистрации километровый айдишник сразу начинаешь думать, что жизнь на том ресурсе бьёт ключом.
    Ответить
    • Слышал

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8