#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
У меня есть модель приложения, в которой есть поля app_id и secret_key. Каков наилучший способ генерировать уникальные app_ids?
Я могу использовать ActiveSupport:SecureRandom.hex(16)
для генерации 32-символьной буквенно-цифровой строки, и, вероятно, другой подобной строки не будет. Если все сделано таким образом, должен ли я также выполнить проверку базы данных, чтобы увидеть, есть ли дубликат app_id или этот шаг не нужен, поскольку вероятность этого бесконечно мала?
Или есть способ получше?
Спасибо!
Тим
Комментарии:
1. Я бы выбрал
ActiveSupport:SecureRandom.hex(16)
а такжеapp_id
проверку уникальности.
Ответ №1:
Я бы всегда перепроверял, просто чтобы быть уверенным. Добавьте уникальный индекс app_id
, и все готово. Сложно гарантировать уникальность
Однако вы могли бы создать строку, которая гарантированно будет уникальной.
string = ActiveSupport::SecureRandom.hex(16)
append = @app.id.to_s
string = string.slice(0, string.length - append.length) append
Итак, первая часть является случайной, но она всегда заканчивается столбцом идентификатора базы данных, который должен быть уникальным.
Также вероятны варианты этого, которые сохраняют структуру случайного вида, например, с использованием шифра Цезаря или простого числового в алфавитный шифр.
Ответ №2:
Я бы сначала проверил.
Вот некоторый код, который я видел в devise, используемый при генерации уникального токена (модифицированный для вашего примера):
loop do
token = ActiveSupport::SecureRandom.hex 16
break token unless find(:first, :token => token)
end
Строка 162:
https://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb