Хеширование разных массивов объектов JSON дает одинаковое значение хеш-функции для всех

Я пытаюсь хэшировать массив объектов JSON, но по какой-то причине сгенерированный hasd не меняется при некоторых обстоятельствах.

Эти примеры были протестированы в nodejs с использованием пакета алгоритмов хеширования sha256.

arr1 = [{a: 1}];
sha(arr1);
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'

arr2 = [{a: 1, b:2}]
sha(arr2);
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'

arr3 = [{a: 1111111111111}];
sha(arr3);
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'

Как вы можете видеть, все массивы имеют одно и то же сгенерированное хеш-значение, даже если они имеют разные свойства.

arr4 = [{a: 1}, {b: 2}];
sha(arr4);
'96a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7'

У этого другой хеш, потому что у него два объекта вместо одного.

Итак, мой вопрос заключается в том, чтобы понять, что не так с первыми тремя массивами, если мне нужно получить другой хэш каждого из них.


person wilson    schedule 12.10.2018    source источник
comment
было бы полезно знать, какой пакет (или внутренний) обеспечивает вашу функцию sha   -  person rlemon    schedule 12.10.2018
comment
Бьюсь об заклад, это просто делает sha('[object object]') или что-то вроде общего строкового представления объекта. Например, возможно, вы должны превратить свои объекты в json перед хешированием.   -  person Nate    schedule 12.10.2018


Ответы (1)


Ваш метод sha(), вероятно, ожидает String и, таким образом, будет приводить ваши объекты к String:

arr1 = [{a: 1}];
sha(arr1);

arr2 = [{a: 1, b:2}]
sha(arr2);

arr3 = [{a: 1111111111111}];
sha(arr3);

arr4 = [{a: 1}, {b: 2}];
sha(arr4);

function sha(v) {
  console.log(v.toString());
}

Поэтому, если вам нужен хеш от этих объектов, вам нужно будет правильно преобразовать их в строку, например, сначала закодировав их в строки JSON.

person Kaiido    schedule 12.10.2018