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