I am attempting to store a SHA-2 256 bit checksum inside a column:

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

I am storing within the value like so:

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

Around the assignment of large_num to c.value I recieve:

NoMethodError: undefined method `gsub' for #<Bignum:0x00000001ea48f8>

Anybody understand what I am doing wrong?

If you are likely to be storing your SHA2 inside a binary column then you definitely most likely would like to make use of the [cde] method to obtain the raw SHA2 bytes:


Your SHA2 is really a 256 bit value (32 bytes) which will not easily fit in a Fixnum (which utilizes under 32 or 64 bits because of internal bookkeeping bits), this is exactly why you finish track of a Bignum whenever you call big_num = Digest::SHA2.new.update("some string to be checksum'd").digest . Binary posts are actually just sequences of bytes (i.e. binary strings) and area of the encoding mechanism is most likely using [cde] to obtain the bytes in to the format the database needs. You are setting a Bignum to something which needs to determine a String which does not work that well.

You might make use of a simple string column (with .hexdigest.to_i(16)) to keep the gsub value rather than a 32 byte binary column.