Я ищу способ генерации хэша SHA-512 из строки json в Ruby, независимо от положения элементов в нем и независимо от вложенности, массивов , вложенные массивы и т. д. Я просто хочу хэш сырые данные вместе со своими ключами.JSON генерирует уникальное значение хэша (SHA-512)
Я пробовал некоторые подходы с преобразованием JSON в хэш-рубин, глубоко сортировать их по их ключам, добавлять все в одну, длинную строку и хэш-код. Но я уверен, что мое решение не является самым эффективным, и что должен быть лучший способ сделать это.
EDIT
До сих пор я преобразовать JSON в хэш Ruby. Тогда я пытаюсь использовать эту функцию, чтобы получить каноническое представление:
def self.canonical_string_from_hash value, key=nil
str = ""
if value.is_a? Hash
value.keys.sort.each do |k|
str += canonical_string_from_hash(value[k], k)
end
elsif value.is_a? Array
str += key.to_s
value.each do |v|
str += canonical_string_from_hash(v)
end
else
str += key ? "#{key}#{value}" : value.to_s
end
return str
end
Но я не уверен, если это хороший и эффективный способ сделать это.
Например, этот хэш
hash = {
id: 3,
zoo: "test",
global: [
{ukulele: "ringding", blub: 3},
{blub: nil, ukulele: "rangdang", guitar: "stringstring"}
],
foo: {
ids: [3,4,5],
bar: "asdf"
}
}
конвертируется в эту строку:
barasdfids345globalblub3ukuleleringdingblubguitarstringstringukulelerangdangid3zootest
Пожалуйста, разместите решение, которое у вас есть. –
Вам нужна каноническая форма для ваших данных, в которой вы можете утверждать, что две вещи являются «эквивалентными». Сглаживание структуры означает, что они действительно не эквивалентны (внутри Ruby) во многих отношениях, которые вам не нужны для вашего дайджеста, поэтому вам нужно четко понимать, что это означает для вас (т. Е. Когда два входа имеют одинаковые хэш, что вы хотите сказать о них?). На самом деле часть SHA здесь практически неактуальна, за исключением того, что нет ярлыка, где вы можете получить алгоритм дайджеста, чтобы сделать что-либо из этого для вас - он работает на неправильном уровне, чтобы помочь. –
Сторона примечания: Хэш-значения SHA-512 * не уникальны. Их гораздо меньше, чем допустимых строк JSON. Однако их довольно много, и столкновения, вероятно, вас не затронут. –