Rails:256ビットのチェックサムをデータベースにバイナリとして保存する

私は列にSHA - 2 256ビットのチェックサムを格納しようとしています:

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

私は次のように値を格納しています:

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

big_numをc.valueに代入すると、次のようになります。

NoMethodError: undefined method `gsub' for #

Anybody know what I'm doing wrong?

2

1 答え

SHA2をバイナリ列に格納する場合は、 digest メソッドを使用して、生のSHA2バイトを取得します。

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

あなたのSHA2は256ビットの値(32バイト)であり、これはFixnum(内部の簿記ビットのために32または64ビット未満を使用する)には収まりません。そのため、 .hexdigest.to_i(16)。バイナリ列は実際にはバイトのシーケンス(バイナリ文字列)であり、エンコーディングメカニズムの一部はおそらく gsub を使用して、データベースが予期している形式にバイトを取得します。あなたはBignumをStringを見ることを期待するものに割り当て、それはうまくいきません。

You could also use a simple string column (with :limit=> 64) to store the .hexdigest value instead of a 32 byte binary column.

1
追加された
@ベン:あなたは大歓迎です。エラーメッセージと実際の問題の間の接続は、この場合かなり不明瞭でした。
追加された 著者 mu is too short,
ダイジェストメソッドを使うことはやりました。ありがとうございました。
追加された 著者 Ben,