PDA

Просмотр полной версии : [Вопрос] Уникальный идентификатор



UnO
02.02.2019, 21:25
Нужно сгенерировать уникальный идентификатор в mysql, который бы был в пределах 100-999(а значит, всего в таблицу может влезть 899 строк), пока в голове лишь бредовые идеи ):
надеюсь на хелп

Geebrox
03.02.2019, 00:17
Можно создать массив с уже использованными идентификаторами и каждый раз проверять не заполнен ли массив, далее создать новый идентификатор. Ну естественно использовать random для подбора рандомного числа в пределах 0-899 и проверять слот массива на занятость и так далее пока не попадётся пустой. Это первое, что пришло мне в голову, если подумать то можно сделать более оптимизированным.

P.S. Надеюсь я правильно понял суть вопроса) Если опишешь подробнее, к чему и зачем всё это делается, возможно будут более точные ответы.

UnO
03.02.2019, 00:59
Можно создать массив с уже использованными идентификаторами и каждый раз проверять не заполнен ли массив, далее создать новый идентификатор.
массив же будет до рестарта хранить идентификаторы; хотя, в принципе, при каждом запуске мода можно заново выгружать из бд и заполнять массив



Ну естественно использовать random для подбора рандомного числа в пределах 0-899 и проверять слот массива на занятость и так далее пока не попадётся пустой.

будет плохо, когда из 899 останется 2-3 пустых слота хД



Если опишешь подробнее, к чему и зачем всё это делается, возможно будут более точные ответы.

Делаю досье по тз, можно добавлять/удалять/смотреть какой-то текст про игроков. При добавлении и нужно генерировать id.

Geebrox
03.02.2019, 02:07
хотя, в принципе, при каждом запуске мода можно заново выгружать из бд и заполнять массив

Ну я это и имел ввиду.


будет плохо, когда из 899 останется 2-3 пустых слота хД
Можно сделать проверку на пустые слоты, и если их слишком мало то просто заполнять их.
А вообще было бы логичнее использовать foreach. И почему нужно заполнять массив рандомно? Почему нельзя заполнять по вырастанию [1.2.3.4...]? <- в этом случае foreach точно оптимальное решение по моему...

UnO
03.02.2019, 03:37
В механизм работы форича никогда особо сильно не углублялся, вот набросал пока что


new Iterator:iPlayerInfo<999>;
//ongamemodeinit
{
mysql_query(db_handle, "SELECT id FROM players_info");

new rows = cache_num_rows(),
id;

for(new i;i<rows;i++)
{
cache_get_value_name_int(i, "id", id);
Iter_Add(iPlayerInfo, id);
}
}

stock GetFreePlayerInfoID()
{
return Iter_Free(iPlayerInfo);
}

ты это имел ввиду?

Оно не будет слишком долго? хД
первый цикл может быть на 899 итераций+в каждой ещё вложенный цикл при добавлении значения в итератор
И, кроме того, надо же начинать со 100, а не с 0.
В общем, если тебе не будет впадлу, объясни вкратце, если нет - полезу уже завтра сам в форичь смотреть

Да, кст, я же и не говорил ничего про конкретно рандом, можно и по-возрастанию

Geebrox
03.02.2019, 03:46
В механизм работы форича никогда особо сильно не углублялся, вот набросал пока что


new Iterator:iPlayerInfo<999>;
//ongamemodeinit
{
mysql_query(db_handle, "SELECT id FROM players_info");

new rows = cache_num_rows(),
id;

for(new i;i<rows;i++)
{
cache_get_value_name_int(rows, "id", id);
Iter_Add(iPlayerInfo, id);
}
}

stock GetFreePlayerInfoID()
{
return Iter_Free(iPlayerInfo);
}

ты это имел ввиду?
Именно


Оно не будет слишком долго? хД
первый цикл может быть на 899 итераций+в каждой ещё вложенный цикл при добавлении значения в итератор
Нет, почему же нет? Ответ найдешь прочитав эту статью (http://pro-pawn.ru/showthread.php?15081)


И, кроме того, надо же начинать со 100, а не с 0.
Что мешает при возврате добавлять 100 к ответу? Ты создай массив не с 999 ячейками а 899

stock GetFreePlayerInfoID()
{
return Iter_Free(iPlayerInfo) + 100;
}


В общем, если тебе не будет впадлу, объясни вкратце, если нет - полезу уже завтра сам в форичь смотреть
Мне не впадлу, все непонятные моменты можешь спрашивать в этой теме.


Да, кст, я же и не говорил ничего про конкретно рандом, можно и по-возрастанию
Ну тогда отлично, просто из за "уникальный" в называние я что-то запутался)