@vanderv
Ruby on Rails

Как организовать генерацию уникального 5-тизначного номера заказа (только цифры) в ruby on rails?

Как организовать генерацию уникального 5-тизначного номера заказа (только цифры) в ruby on rails?
Хочу организовать страницу "Статус заказа"... Если указывать просто id, то можно получить очн много ненужной информации (понять сколько вообще заказов, просмотреть статусы других заказов и тд)
  • Вопрос задан
  • 3567 просмотров
Решения вопроса 1
gleberof
@gleberof
это я
Если хотите простой номер (5 значный), дайте доступ к заказу только тем кто его заказал (после авторизации) Т.е. если посетитель не авторизован или не заказывал конкретный заказ - его всегда приземляет например на страницу авторизации (или если авторизован - такого заказа нет). Это не сложно сделать с помошью before_filter в контроллере.

Сам номер рекомендую формировать по простому правилу (так чтобы по нему легко было ориентироваться либо клиенту, либо клиентской службе). Например зашивать в него дату (номер недели в году и номер дня в недели, например, это 3 цифры. Еще 2 на номер заказа в этот день.).
Номер заказа на текущий день можно выбирать, например, из массива чисел от 0 до 99 и выяеркивать случайным образом и удалать выбранное число из массива. Понятно что если будет более 100 заказов в день - этот алгоритм не позволит сформировать 101 заказ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@modernstyle
Code GOD
я бы генерил рандомный номер,

(0...3).map { rand(26) }.join

соединял его с номером заказа.
В таблицу можно добавить order_string, например.

Настройки видимости других аттрибутов можно отдать Cancan. Как-то так.
Ответ написан
Комментировать
sdevalex
@sdevalex
> Если указывать просто id
ID можно начинать не с 1, а с другого крупного числа. При создании таблицы просто указать другой next id.

> просмотреть статусы других заказов
5-значный номер можно очень быстро подобрать, если кому-то охота будет посмотреть все статусы. Если вы отдаёте страницу всем, кто знает ID, то просто не оставляйте там личный данных (имена, адреса).
Ответ написан
Комментировать
magnitudo
@magnitudo
Архитектор, программист, предприниматель...
Правильно вам говорят насчёт подбора кодов и размера, 5 цифр (99999) это уж очень мало.
Но если очень хочется, то очень хорошо подходят всякие CRC (8,16,32) -- выбирайте на любой вкус. Берёте некий секретный текст, в конце по определённым правилам дописываете реальный id и считаете CRC. Плюс CRC в том, что при незначительных изменениях входных данных, выходное значение меняется сильно, т.е. очень легко выявить последовательный брутфорс с одного хоста и его заблокировать.
Можно посмотреть в сторону всяких хэшей, но у них разрядность большая и считаются они сложнее.
Ответ написан
Комментировать
@Slko
C++/C#/Python Developer
На своём ресурсе мне приходилось реализовывать такое, но только чтобы результатом была последовательность символов, как у идентификатора видео на YouTube. И при этом чтобы из этой последовательности символов можно было получить исходное число. Для этих целей можно применять любой блочный шифр, который на выходе даёт последовательность с длиной, равной исходной. Я не знаю, есть ли шифры с 16-битным блоком, чтобы число было достаточно маленькими. В моём случае я применял свой велосипед на основе сети Фейстеля. Очень простая схема и для понимания, и для реализации.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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