2010-01-24 16 views
9

Ho un modulo su un sito Web che raccoglie alcune informazioni personali dal visitatore. Trasmetto queste informazioni a un altro servizio e devo assegnare a ciascuna di queste forme un hash unico di 100 caratteri da memorizzare nel DB con il record. Qual è il modo ottimale per generare questa chiave e assicurarti che sia unica? Va bene se il tasto si incrementa automaticamente.Assegnazione a ciascun utente di un Hash univoco di 100 caratteri in Ruby on Rails

risposta

22
ActiveSupport::SecureRandom.hex(50) 

La possibilità di non essere unici è astronomica.

Alternativa semplice "non scala".

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 

Se davvero vuole fare in modo, fa un indice univoco sulla colonna, e gestire un errore di unicità DB da riprovare, simile alla mia implementazione sopra.

+3

In Rails sopra 3.1 questo è diventato solo "SecureRandom.hex (50)". – Bulat

+1

Due cose che vale la pena menzionare, solo 10 minuti circa: 1. 'SecureRandom.hex (n)' raddoppia 'n' come lunghezza del carattere nel codice generato (quindi niente oltre 120 o qualsiasi cosa per i tipi di stringa Postgres) 2. Non dimenticare di salvare il modello dopo aver assegnato il valore! (Duh) –

0

Se si utilizza un Cipher è possibile crittografare un messaggio sempre diverso per ottenere una sempre diversa chiave:

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"