Кресты / Говнокод #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 FataLL, (Updated )

Комментарии (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

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

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

Где здесь C++, guest?!

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


    8