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

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
/**
     * Конвертирует шестнадцатеричное число в десятичное
     *
     * @param string $hex шестнадцатиричное число
     * @return string десятичное число
     */
    private static function convertHexToBase10(string $hex): string
    {
        $base10result = 0;
        foreach (str_split(trim($hex)) as $hexPart) {
            $base10 = base_convert($hexPart, 16, 10);
            $base10result = gmp_add(gmp_mul($base10result, 16), $base10);
        }

        return $base10result;
    }

Задания для самопроверки:
1. Найдите ошибку в phpdoc.
2. Укажите функцию из стандартной поставки PHP, которая делает то же самое.
3. Дана строка, представляющая md5-хеш, то есть строковое представление 128-битного шестнадцатиричного числа. Напишите пример вызова функции из стандартной поставки PHP, возвращающую остаток от деления этого числа на 3, не используя функцию из предыдущего задания.

Запостил: anei anei, (Updated )

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

  • а че. мне уже даже интересно стало - на MD & SHA ключики как на числа посмотреться. о - и мак аддреса тоже. и даже IPv4/6 аддреса. а мы дураки с ними как массивами мучаемся - а их ведь можно в число просто сконвертить! красота среди бегущих!
    Ответить
    • Это что, я даже текст не более чем из 8 байт могу в сишечке и плюсах в uint64_t переменную засунуть на 64-битном проце
      Ответить
    • IP адреса - это и есть числа, точки там разделяют байты (октеты) только для удобства человеков. А маска подсети - это на самом деле и есть битовая маска, при наложении (т.е. операция логического И) которой на ip получается та часть адреса, которая иденцифицирует подсеть.
      Примерно так:
      echo inet_ntop(inet_pton('192.168.0.32') & inet_pton('255.255.255.128'));
      // 192.168.0.0
      echo inet_ntop(inet_pton('192.168.0.253') & inet_pton('255.255.255.128'));
      // 192.168.0.128


      В стародавние времена админил я потихоньку в одной конторе, заодно и сайт говнокодил. При переезде админ провайдера выдал нам ip, маску (маска была очень узкая, там буквально пара бит оставалась на идентификатор узла) и адрес шлюза. Вбиваю - интернета нет, шлюз не пингуется. Накладываю маску на наш айпишник и на айпи шлюза, и обнаруживаю, что они с такой маской вообще не в одной подсети. Пришлось звонить провайдеру, долго и нудно объяснять, как работает маска подсети, админ не сразу допёр, в чём проблема.

      Вот такая админская версия говнокода.
      Ответить
      • Был бы тогда не (не птнгуется), а no route to host или destination unreachable

        Спасибо что рассказал нам про cidr, мы не знали
        Ответить
      • Нормальный знак, проблема в том, что автор кода тоже знает эту функцию. hexdec(md5('somestring')) не сработает как надо.
        Почему, кстати?
        Ответить
        • Потому что число 128битное, а платформа не выдержит больше 64 бит. Но занимаются этим bcmapth и gmp, которые в стандартную поставку никак не входят, поэтому это ближайшее, что я знаю.
          Ответить
          • Это мой косяк. Я привык, что у меня этот набор функций всегда есть, и не проверил. Посыпаю голову пеплом.
            Ответить
            • Посыпаю голову пеплом.

              Теперь полей ее расплавленной селитрой.
              Ответить
  • # 1. Найдите ошибку в phpdoc.
    # * @return string десятичное число
    # foreach(str_split(trim($hex)) as ...)
    # $base10result = 0;
    # return $base10result;

    А вдруг str_split вернёт пустой итерируемый объект и функция вернёт 0 (int, а не string)?
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8