Задать вопрос

Как получить случайное неповторяющееся во времени значение?

Таблица: id, code, code_date. Как сгенерировать случайное числовое 4-х символьное значение и записать его в поле code строки с определенным id. Значение не должно повторяться последние 5 минут между текущей/датой временем и значением в поле code_date. При записи code также должно обновиться поле code_date.
Случайное значение: floor(random() * (10000 - 1000) + 1000)
Разность во времени: EXTRACT(EPOCH FROM (NOW() - code_date))<300

Как сделать, чтобы случайное значение менялось, если уже было такое же в любой строке в указанный промежуток времени? id строки, которую надо изменять, известен.
  • Вопрос задан
  • 306 просмотров
Подписаться 4 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 3
Griboks
@Griboks
Как получить случайное неповторяющееся во времени значение?

Это невозможно. Значение может быть либо случайным, либо неповторяющимся. Если вам нужно случайное значение, то это обычный рандом (который по умолчанию 64 бита). Если нужно неповторяющееся значение, то это текущее время (unix timestamp).
Ответ написан
Комментировать
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Для таких целей изобрели GUID, но он тоже не даёт гарантии неповторения, только очень сильно уменьшает эту вероятность
Ответ написан
Комментировать
Это нужно для реализации OTC (One-time code) ? Типа кода через СМС или мессенжер, действительный в течение 5 минут?

Учтите ограниченность «ёмкости» кодов из всего 4 символов. Если вдруг весь Китай ринется регистрироваться у вас, кодов не хватит. Помимо кода, наверняка стоит использовать что-то ещё, например, куки, переменную сессии. Иначе можно ввести любые 4 символа – и, может, повезёт — войдёшь под чьим-то аккаунтом.

Один из вариантов «в лоб» – держать таблицу всех возможных кодов: «код – timestamp». Не такая уж и большая. Из неё легко выбирать случайный код с timestamp'ом более X минут назад. Ставить ему текущий таймстемп и его же прописывать юзеру для входа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы