Вот что я использую.Маркер не обязательно должен быть услышан, чтобы угадать, он больше похож на короткий URL-идентификатор, чем на что-либо еще, и я хочу, чтобы он был коротким.Я следовал за некоторыми примерами, которые нашел в Интернете, и в случае коллизии я думаю приведенный ниже код воссоздает токен, но я не совсем уверен.Мне любопытно увидеть лучшие предложения, хотя это выглядит немного грубо по краям.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Моя колонка базы данных для токена является уникальным индексом, и я также использую validates_uniqueness_of :token
намодели, но поскольку они создаются партиями автоматически на основе действий пользователя в приложении (они по сути размещают заказ и покупают токены), приложение не может выдать ошибку.
Iя мог бы также, я думаю, уменьшить вероятность коллизий, добавить еще одну строку в конце, что-то сгенерированное на основе времени или что-то в этом роде, но я не хочу, чтобы токен получился слишком длинным.