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