Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Универсальный короткий id (https://javascript.ru/forum/offtopic/48001-universalnyjj-korotkijj-id.html)

dmitry111 15.06.2014 22:51

Универсальный короткий id
 
Возникла ситуация:

нужно создавать максимально короткие id к данным. Причем делать это нужно как можно более экономично (в плане ресурсов).

id имеет малый период жизни, а количество одновременно живущих id может достигать 1000-3000






Как я думаю это сделать:

Решил использовать base36 в качестве генерации уникальных id.
Значения id будет от 1 до 4-х символов (то есть короткие!), при этом диапазон значений весьма неплохой - 1679615 !

// возвращает уникальный короткий ID в заданном числовом диапазоне
function getRandomID(min, max) {
  var int = Math.floor(Math.random() * (max - min + 1)) + min;

  return int.toString(36);
}

var id = getRandomID(0, 1679615);

alert(id);


Конечно данный id может оказаться уже задействованным (среди тех активных 1000-3000 айдишников), поэтому нужно проверять перед использованием! Но такая вероятность ничтожна в случае с 3000 id - вероятность 1 на 559




А как бы вы это делали?

рони 15.06.2014 23:10

dmitry111,
а если сгенерировать 1 раз 5000 уникальных и потом пользоваться ?

l-liava-l 15.06.2014 23:11

dmitry111,
А тупо инкрементировать старый id?

dmitry111 15.06.2014 23:13

Цитата:

Сообщение от рони
а если сгенерировать 1 раз 5000 уникальных и потом пользоваться ?

забыл уточнить, они (айдишники) то появляются то удаляются

dmitry111 15.06.2014 23:13

Цитата:

Сообщение от l-liava-l
А тупо инкрементировать старый id?

3000 айдишников перебирать каждый раз - это затратно!

dmitry111 15.06.2014 23:22

айдишники нужны для пуль в онлайн игре. Пуль много, сервер создает и уничтожает их.

Если предположить, что игроков 20, а пули вылетают у каждого игрока примерно 30 пуль в секунду, получается 600 id в секунду

Каждая пуля (id) имеет время жизни, например 3 секунды, то есть 1800 id - одновременно активны!

рони 15.06.2014 23:28

dmitry111,
зачем перебирать ? берёшь всегда первый id из 5000 -- возвращаешь на последнее место

Vlasenko Fedor 15.06.2014 23:32

объясните и расскажите полностью задачу. Зачем генерировать рандомно
Цитата:

Сообщение от dmitry111
сервер создает и уничтожает их.

и что
что как и зачем обрабатывает ид
function getId() {
        var i = 0;
        return function () {
          i += 1;
          return 'id' + i;
        }
      }
      var newId = getId();
      alert (newId());
      alert (newId());

l-liava-l 15.06.2014 23:44

Poznakomlus,
вот и я говорю нужно инкрементировать, или вообще

var nonce = Date.now()
alert(nonce)

nerv_ 15.06.2014 23:46

Цитата:

Сообщение от dmitry111
Если предположить, что игроков 20, а пули вылетают у каждого игрока примерно 30 пуль в секунду, получается 600 id в секунду

Каждая пуля (id) имеет время жизни, например 3 секунды, то есть 1800 id - одновременно активны!

а я 5400 насчитал :)

Цитата:

Сообщение от l-liava-l
или вообще

alert(Date.now() === Date.now());


Часовой пояс GMT +3, время: 19:43.