2

列に 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 #<Bignum:0x00000001ea48f8>

私が間違っていることを知っている人はいますか?

4

1 に答える 1

1

digestSHA2 をバイナリ列に格納する場合は、メソッドを使用して生の SHA2 バイトを取得するだけでよいでしょう。

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

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

32 バイトのバイナリ列の代わりに、単純な文字列列 ( を使用:limit=> 64) を使用して値を格納することもできます。.hexdigest

于 2011-12-19T00:09:59.547 に答える