Вот что я использую. Маркер не обязательно должен быть услышан, чтобы угадать, он больше похож на короткий 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
его для модели, но поскольку они создаются партиями автоматически на основе действий пользователя в приложении (они размещают заказ и покупают токены, по сути), это не возможно, чтобы приложение выдало ошибку.
Я мог бы также, я думаю, уменьшить вероятность коллизий, добавить еще одну строку в конце, что-то сгенерированное на основе времени или что-то в этом роде, но я не хочу, чтобы токен становился слишком длинным.