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

如果您要将 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 并且效果不佳的东西。

您还可以使用简单的字符串列(带有:limit=> 64)来存储.hexdigest值,而不是使用 32 字节的二进制列。

于 2011-12-19T00:09:59.547 回答