1. C++ / Говнокод #28467

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    std::map<int,bool> usedIds;
    ...
    int SomeClass::GetNewId()
    {
      int nId = 1;
      while( usedIds.find( nId ) != usedIds.end() ) nId++;
      usedIds[nId] = true;
      return nId;
    }

    Таких map'ов несколько. Ищем неиспользованные циферки...

    Запостил: FataLL, 02 Декабря 2022

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

    • Я бы наоборот хранил свободные ID. А если их нет, инкрементил бы счётчик «максимально выданный ID» и лениво добавлял бы в пул свободных.
      Ответить
      • > хранил свободные ID
        > пул свободных

        Недавно ж обсуждали.
        class SomeClass {
        public:
            static uint64_t GetNewId()
            {
                return ++freeId;
            }
        private:
            static std::atomic<std::uint64_t> freeId = 0;
        };
        Ответить
        • Я так понял у него освобождаться ID могут, иначе всё просто как-то.
          Ответить
          • Нахера освобождать неперсистентные айдишники из кольца вычетов по модулю 2^64? Они закончатся явно не раньше, чем компьютер, на котором запущена эта программа, сгниёт от старости.
            Ответить
            • Откуда я знаю? Может у него сервак игровой, и чтобы ID игроков было 2-3-значными, он переиспотзует ID тех, кто ливнул. В GTA SAMP так работает.
              Ответить
            • А в прыщах, кстати, как ID процессов генерируются?
              Ответить
              • Инкрементально

                Я знаю одну ОС, где они генерируются рендомно в целях конспирации
                Угадаешь какую?
                Ответить
              • Откуда я знаю? Я виндузятник. У нас на сперме айдишники переиспользуются — от этого бывает очень смешно, когда написанная ламером программа сохраняет PID потомка, потом решает его убить — а он уже давно вышел, и вместо него убивается какой-нибудь «Фотошоп».

                На PID родителя тоже смотреть бессмысленно: там может быть кто угодно.
                Ответить
                • Надо хранить хендл потомка потому что и по нему грохать

                  PID на винде может указывать на и вовсе мёртвый уже процесс, потому что на винде (в отличие от юникса) у родителя никаких обязанностей нету
                  Ответить
                • есть специальная api-функция, dnk-test, чтобы узнать, кто был родителем.
                  Ответить
            • Каждые 28 лет программу нужно перезапускать, так как айдишники заканчиваются
              Ответить
      • > Я бы наоборот хранил свободные ID.
        Но их же 4 миллиарда.
        Да, надо ещё хранить максимальный занятый N, а в сете хранить только те свободные, которые не превышают N
        Ответить
        • Надет ли зимний протектор на колесо твоей развалюхи, TarasB?
          Ответить
    • > std::map<int,bool>

      Это называется std::set.
      (Да, технически в мапе у элемента есть три состояния: не присутствует, истина и ложь, но данный код и никакой подобный ему, который я видел, это не использует)
      Ответить
    • Я бы добавил результат последнего поиска ещё
      Ответить
      • Ура, Тарас вернулся!
        Ответить
      • А-а-а, бородатый любитель южан забрёл на огонек...
        Какой багор )))
        Ответить

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