Rails:在数据库中存储256位校验和作为二进制文件

时间:2011-12-18 23:46:56

标签: ruby-on-rails database binary checksum bignum

我正在尝试在列中存储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>

有人知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

如果您要将SHA2存储在二进制列中,那么您可能只想使用digest method来获取原始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将字节转换为数据库所需的格式。您将Bignum分配给期望看到字符串并且效果不佳的东西。

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