Генерация уникальных 32-символьных строк в Rails 3

#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