Просмотр полной версии : [Вопрос] Уникальный идентификатор
Нужно сгенерировать уникальный идентификатор в mysql, который бы был в пределах 100-999(а значит, всего в таблицу может влезть 899 строк), пока в голове лишь бредовые идеи ):
надеюсь на хелп
Можно создать массив с уже использованными идентификаторами и каждый раз проверять не заполнен ли массив, далее создать новый идентификатор. Ну естественно использовать random для подбора рандомного числа в пределах 0-899 и проверять слот массива на занятость и так далее пока не попадётся пустой. Это первое, что пришло мне в голову, если подумать то можно сделать более оптимизированным.
P.S. Надеюсь я правильно понял суть вопроса) Если опишешь подробнее, к чему и зачем всё это делается, возможно будут более точные ответы.
Можно создать массив с уже использованными идентификаторами и каждый раз проверять не заполнен ли массив, далее создать новый идентификатор.
массив же будет до рестарта хранить идентификаторы; хотя, в принципе, при каждом запуске мода можно заново выгружать из бд и заполнять массив
Ну естественно использовать random для подбора рандомного числа в пределах 0-899 и проверять слот массива на занятость и так далее пока не попадётся пустой.
будет плохо, когда из 899 останется 2-3 пустых слота хД
Если опишешь подробнее, к чему и зачем всё это делается, возможно будут более точные ответы.
Делаю досье по тз, можно добавлять/удалять/смотреть какой-то текст про игроков. При добавлении и нужно генерировать id.
хотя, в принципе, при каждом запуске мода можно заново выгружать из бд и заполнять массив
Ну я это и имел ввиду.
будет плохо, когда из 899 останется 2-3 пустых слота хД
Можно сделать проверку на пустые слоты, и если их слишком мало то просто заполнять их.
А вообще было бы логичнее использовать foreach. И почему нужно заполнять массив рандомно? Почему нельзя заполнять по вырастанию [1.2.3.4...]? <- в этом случае foreach точно оптимальное решение по моему...
В механизм работы форича никогда особо сильно не углублялся, вот набросал пока что
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.
В общем, если тебе не будет впадлу, объясни вкратце, если нет - полезу уже завтра сам в форичь смотреть
Да, кст, я же и не говорил ничего про конкретно рандом, можно и по-возрастанию
В механизм работы форича никогда особо сильно не углублялся, вот набросал пока что
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;
}
В общем, если тебе не будет впадлу, объясни вкратце, если нет - полезу уже завтра сам в форичь смотреть
Мне не впадлу, все непонятные моменты можешь спрашивать в этой теме.
Да, кст, я же и не говорил ничего про конкретно рандом, можно и по-возрастанию
Ну тогда отлично, просто из за "уникальный" в называние я что-то запутался)
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot