Rails: хранение 256-битной контрольной суммы в виде двоичного файла в базе данных - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь сохранить 256-битную контрольную сумму SHA-2 в столбце:

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 Ответ

1 голос
/ 19 декабря 2011

Если вы собираетесь хранить свой SHA2 в двоичном столбце, то, возможно, вы просто захотите использовать digest метод , чтобы получить необработанные байты 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-байтового двоичного столбца.

...