Мне нужно создать строку подписи для переменной в Ruby, где переменная может быть числом, строкой, хешем или массивом. Хеш-значения и элементы массива также могут быть любого из этих типов.
Эта строка будет использоваться для сравнения значений в базе данных (в данном случае Mongo).
Моей первой мыслью было создать хэш MD5 для значение в кодировке JSON, например: (body - это указанная выше переменная)
def createsig(body)
Digest::MD5.hexdigest(JSON.generate(body))
end
Это почти работает, но JSON.generate не кодирует ключи хеша каждый раз в одном и том же порядке, поэтому createdig ({ : a => 'a',: b => 'b'})
не всегда равно createdig ({: b => 'b',: a => 'a'})
.
Как лучше всего создать строку подписи, отвечающую этой потребности?
Примечание. Что касается ориентированности на детали среди нас, я знаю, что вы не можете JSON.generate ()
a число или строка. В этих случаях я бы просто вызвал MD5.hexdigest ()
напрямую.