2011-12-18 2 views
2

je vais essayer de stocker une somme de contrôle de bits SHA-2 256 dans une colonne:Rails à: stocker une somme de contrôle 256 bits sous forme binaire dans la base de données

create_table :checksums do |t| 
    t.binary :value, :null => false, :limit => 32 
end 

Je stocker la valeur comme ceci:

c = Checksum.new 
big_num = Digest::SHA2.new.update("some string to be checksum'd").hexdigest.to_i(16) 
c.value = big_num 

sur la cession de big_num à c.value je reçois:

NoMethodError: undefined method `gsub' for #<Bignum:0x00000001ea48f8> 

Tout le monde sait ce que je fais mal?

Répondre

1

Si vous allez à stocker votre SHA2 dans une colonne binaire alors vous voudrez probablement juste utiliser le digest method pour obtenir les octets SHA2 premières:

big_num = Digest::SHA2.new.update("some string to be checksum'd").digest 

Votre SHA2 est une valeur de 256 bits (32 octets) et qui ne rentre pas dans un Fixnum (qui utilise moins de 32 ou 64 bits en raison de bits internes de comptabilité), c'est pourquoi vous vous retrouvez avec un Bignum lorsque vous appelez .hexdigest.to_i(16). Les colonnes binaires ne sont en réalité que des séquences d'octets (c'est-à-dire les chaînes binaires) et une partie du mécanisme de codage utilise probablement gsub pour obtenir les octets dans le format attendu par la base de données. Vous affectez un Bignum à quelque chose qui s'attend à voir une chaîne et qui ne fonctionne pas très bien.

Vous pouvez également utiliser une simple colonne de chaîne (avec :limit=> 64) pour stocker la valeur .hexdigest au lieu d'une colonne binaire de 32 octets.

+0

L'utilisation de la méthode digest a fait l'affaire. Je vous remercie. – Ben

+0

@Ben: De rien. La connexion entre le message d'erreur et le vrai problème était assez obscure dans ce cas. –

Questions connexes