Если бы вы могли получить только строковое представление body
и не иметь хэша Ruby 1.8, возвращающегося с разными порядками от одного к другому, вы могли бы надежно хэшировать это строковое представление. Давайте испачкаем руки обезьянами:
require 'digest/md5'
class Object
def md5key
to_s
end
end
class Array
def md5key
map(&:md5key).join
end
end
class Hash
def md5key
sort.map(&:md5key).join
end
end
Теперь любой объект (из типов, упомянутых в вопросе) отвечает на md5key
, возвращая надежный ключ для использования при создании контрольной суммы, поэтому:
def createsig(o)
Digest::MD5.hexdigest(o.md5key)
end
Пример:
body = [
{
'bar' => [
345,
"baz",
],
'qux' => 7,
},
"foo",
123,
]
p body.md5key # => "bar345bazqux7foo123"
p createsig(body) # => "3a92036374de88118faf19483fe2572e"
Примечание. Это хэш-представление не кодирует структуру, а только объединяет значения. Поэтому ["a", "b", "c"] будут хешировать так же, как ["abc"].