1. Java / Говнокод #26969

    0

    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
    public static UUID fromString(String name) {
            String[] components = name.split("-");
            if (components.length != 5)
                throw new IllegalArgumentException("Invalid UUID string: "+name);
            for (int i=0; i<5; i++)
                components[i] = "0x"+components[i];
    
            long mostSigBits = Long.decode(components[0]).longValue();
            mostSigBits <<= 16;
            mostSigBits |= Long.decode(components[1]).longValue();
            mostSigBits <<= 16;
            mostSigBits |= Long.decode(components[2]).longValue();
    
            long leastSigBits = Long.decode(components[3]).longValue();
            leastSigBits <<= 48;
            leastSigBits |= Long.decode(components[4]).longValue();
    
            return new UUID(mostSigBits, leastSigBits);
        }

    без префикса "0x" написать рабочий код было невозможно, очевидно
    это хоть починили

    https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/java/util/UUID.java#L191-L209

    Запостил: Fike, 22 Сентября 2020

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

    • - Ох, о-о-о-о, ох, мертвая еда...
      - Леонид Ильич, переверните, у нас бумага кончилась, и мы вам речь на программистской оборотке напечатали...
      Ответить
    • Кстати, есть хоть одна прога, где реально юзаются поля UUID'а?
      Ответить
      • Ну что, никто не знает?
        Ответить
      • В смысле "поля"?
        В ОП десериализация же в 128-битное значение, не?
        Ответить
        • > 128-битное значение

          Ну вот и я об этом. Для 99.99% программ это просто уникальные 16 байт без какой-либо структуры.

          Но все пердолятся с парсингом "полей" разной длины, разделённых чёрточками. Обратная совместимость такая обратная совместимость. Там вроде время когда-то было и ещё что-то.
          Ответить
          • Был RFC с классами UUID'ов. Номер класса обозначался где-то в самой середине. Так вот в одном классе где-то в середине было время, в другом — ещё какая-то фигня.
            Ответить
            • Сейчас вроде везде последний класс, где тупо 124 бита рандома.
              Ответить
              • Нашёл: https://tools.ietf.org/html/rfc4122
                Ответить
              • Смотрим RFC.

                The variant field determines the layout of the UUID.

                Значение 100 и 101 (двоичное) поля вариант означает юниксоидный UUID, описанный в RFC, который содержит время.

                Значение 110 означает UUID, совместимый с «Микрософтом».

                Другие варианты с точки зрения того RFC зарезервированы.
                Ответить
              • Читаю дальше.

                The version number is in the most significant 4 bits of the time stamp (bits 4 through 7 of the time_hi_and_version field).

                Оказывается, у UUID, описанного в RFC, ещё куча вариантов.

                1 The time-based version specified in this document.
                2 DCE Security version, with embedded POSIX UIDs.
                3 The name-based version specified in this document that uses MD5 hashing.
                4 The randomly or pseudo-randomly generated version specified in this document.
                5 The name-based version specified in this document that uses SHA-1 hashing.
                Ответить
                • И получается, что для версий 3, 4, 5 поля Timestamp и Clock Sequence содержат не время, а псевдослучайное число (версия 4) или хэш от какой-нибудь питушни (MD5 или SHA-1).
                  Ответить
                • Самое страшное, что та древняя версия 1, которая содержала время, в поле Node должна была содержать MAC-адрес основного сетевого адаптера данной машины, т. е. UUID получался не совсем случайным.
                  Ответить
                  • > самое страшное

                    http://govnokod.ru/26969#comment578025
                    Ответить
                  • Угу, и сливал твой мак. Именно поэтому я за четвёртую версию.
                    Ответить
                    • Надо просканировать ууиды из разного софта, отфильтровать первую версию, тогда есть шанс восстановить маки, принадлежащие разным компаниям (если, конечно, разработчики софта не догадались вместо реального мака вставлять фейковый).
                      Ответить
                      • > фейковый

                        Эээ... дык тогда вся суть пропадает, он уже не уникальный будет. Хотя китайцы и так поди поднасрали с сетевухами, у которых одинаковый мак.
                        Ответить
                        • Сейчас ещё бывают багры из-за китайских мобильников, которые каждые полчаса меняют мак на случайный. Вроде даже у «Айфона» есть такой режим. Теоретически это может вызывать коллизии между пользователями одной точки доступа.
                          Ответить
                          • конечно это вызовет бухор

                            AP пошлет отконнектит STA коли ты смениш мак
                            Ответить
                            • Ну не во время работы же он это делает, между коннектами просто меняет, чтобы не трекали.
                              Ответить
                              • между -- ради бога

                                Но AP тебя не узнает, и может выдать другой IP, например.


                                А дома его не узнали и не пустили в квартиру.
                                — Я столяр Кушаков! — закричал столяр.
                                — Рассказывай! — отвечали из квартиры и
                                заперли дверь на крюк и на цепочку.
                                Столяр Кушаков постоял на лестнице, плюнул и пошел на улицу.
                                Ответить
                • ого, так это я просто так не имею права uuid сгенерить?

                  кстати, ты не инью
                  Ответить
                  • > кстати, ты не инью

                    Сразу видно, да?
                    Ответить
                    • конечно

                      икарус спзидил твой акк
                      Ответить
                      • Холмс, как Вы догадались?
                        Ответить
                        • ты спиздил мой акк
                          мироздание наказало тебя, спиздив твой

                          Олень подстреленный хрипит,
                          Лань, уцелев, резвится,
                          Тот караулит, этот спит -
                          И так весь мир вертится…
                          Ответить
                          • Ты же не матерился раньше.
                            Ответить
                            • Я и Шекспира не цитировал, особенно в варианте "покровских ворот"

                              Нахватаешься тут у вас
                              Ответить
          • Да кто все-то?

            Кстати в жабе ууид до последнего времени был стремный, с маком и сиквенсом. Чтобы на одной ноде, сука, все были похожи, как сестры в-очёвски, а ты такой ищешь где там разница в 25 разряде. Дико бесило всегда, и лень проверять, стало ли лучше.
            Ответить
            • >а ты такой ищешь где там разница в 25 разряде
              похоже на мой BCD
              Windows Boot Loader
              -------------------
              identifier              {eee0502d-fecb-11e8-8360-a219fc908588}
              device                  partition=C:
              path                    \Windows\system32\winload.exe
              description             Windows 7
              locale                  en-US
              recoverysequence        {eee05031-fecb-11e8-8360-a219fc908588}


              Совсем разные UUID
              Ответить
      • Я юзаю в автоматических тестах как уникальный идентификатор сущности, если зачищать базу перед запуском теста невозможно.
        Ответить
        • Что-то специальное туда пишешь, чтобы отличать тестовые гуиды от боевых?
          Ответить
    • Всеж таки языке "всё-по-ссылке" испортили мне мозг.
      никак не могу привыкнуть к тому, что
      Petuh p(22);
      return p;

      и
      return Petuh(22);

      это две большие разницы.

      Причем начиная с +11 петух может быть некопируемым, но двигаемым (как юник) и тогда первый вариант вообще не скомпилируется.
      Ответить
      • Если тип перемещаемый, то оба варианта будут работать.

        А в третьих, NRVO конпеляторы применяли давным-давно, так что на практике первый вариант был не особо то и хуже.
        Ответить
      • а почему это две разницы?

        типа в первом варианте может быть какой-то побочный эффект?
        Ответить
        • Во втором варианте древняя оптимизация RVO, которая везде работала. Во первом варианте нужна более свежая NRVO, которой в говне мамонта не было.
          Ответить

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