我正在尝试在列中存储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>
有人知道我做错了吗?
答案 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字节的二进制列。