Назначение каждому пользователю уникального хэша в 100 символов в Ruby on Rails - PullRequest
9 голосов
/ 24 января 2010

У меня есть форма на веб-сайте, которая принимает некоторую личную информацию от посетителя. Я передаю эту информацию другому сервису, и мне нужно назначить, чтобы каждая из этих форм отправляла уникальный 100-символьный хеш для сохранения в БД с записью Какой оптимальный способ создать этот ключ и убедиться, что он уникален? Ничего страшного, если ключ автоматически увеличивается.

Ответы [ 3 ]

22 голосов
/ 24 января 2010
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

Если вы действительно хотите убедиться, создайте уникальный индекс для столбца и обработайте ошибку уникальности БД, повторив попытку, аналогично моей реализации выше.

2 голосов
/ 24 января 2010

В стандартной библиотеке Ruby есть модуль для генерации идентификаторов GUID:

http://ruby -doc.org / STDLIB / libdoc / переваривать / RDoc / классы / Дайджест / SHA2.html

Пример:

Digest::SHA1.hexdigest(Time.now.to_s)
0 голосов
/ 24 января 2010

Если вы используете шифр, вы можете зашифровать всегда другое сообщение, чтобы получить всегда другой ключ:

  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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...