У меня есть форма на веб-сайте, который берет в некоторых персональных данных от посетителя. Я передаю эту информацию другой службе, и я должен присвоиться, каждый из них формируются, отправляет 100 символьных уникальных хешей, которые будут сохранены в DB с записью. Что оптимальный путь состоит в том, чтобы генерировать этот ключ и удостовериться, что это уникально? Это хорошо если ключевые автоинкременты.
ActiveSupport::SecureRandom.hex(50)
Возможность этого не быть уникальным астрономическим.
Альтернативный простой «не масштабируется».
class MyModel < ActiveRecord::Base
before_create :assign_unique_token
private
def assign_unique_token
self.unique_token = ActiveSupport::SecureRandom.hex(50) until unique_token?
end
def unique_token?
self.class.count(:conditions => {:unique_token => unique_token}) == 0
end
end
Если вы действительно , хотите убедиться, сделать уникальный индекс в столбце и обрабатывать ошибку уникальности БД, повторная повторная ошибка, аналогичная моей реализации выше.
Ruby Standard Lib имеет модуль для генерации GUID:
http://ruby-doc.org/stdlib/libdoc/digest/rdoc/classes/digest/sha2.html
Пример:
Digest::SHA1.hexdigest(Time.now.to_s)
Если вы используете Шифр, вы можете зашифровать всегда другое сообщение, чтобы получить всегда другой ключ:
def encrypt(data, key, cipher_type)
aes = OpenSSL::Cipher::Cipher.new(cipher_type)
aes.encrypt
aes.key = key
aes.update(data) + aes.final
end
>> Base64.encode64(encrypt(Time.now.to_s, "some_key_long_enough_for_the_job", "AES-256-ECB"))
=> "sKJU3qhszV30Ya9vMFvbqIXus+QygICdDyr7UQFWLeM=\n"