Javascript md5 хэш разных массивов дает одинаковое значение

#javascript #md5

#javascript #md5

Вопрос:

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

 const value1 = ["test1"];
const value2 = ["test2"];

const result1 = md5(value1);
const result2 = md5(value2);

// but

const result3 = md5(JSON.stringify(value1));
const result4 = md5(JSON.stringify(value2));

// result1 === result2
// result3 !== result4
 

Комментарии:

1. Проблема # 44 : «Если ошибочно передан массив нецелых чисел, не выполняйте молчаливый хэш [0]»

Ответ №1:

Смотрите исходный код:

   md5 = function (message, options) {
    // Convert to byte array
    if (message.constructor == String)
      if (options amp;amp; options.encoding === 'binary')
        message = bin.stringToBytes(message);
      else
        message = utf8.stringToBytes(message);
    else if (isBuffer(message))
      message = Array.prototype.slice.call(message, 0);
    else if (!Array.isArray(message) amp;amp; message.constructor !== Uint8Array)
      message = message.toString();
    // else, assume byte array already
 

Если вы передаете ему массив для сообщения (которым вы являетесь в первых двух случаях), то предполагается, что вы передаете ему массив байтов.

Вы передаете ему массив строк, поэтому он ломается.

Комментарии:

1. Интересно видеть, как код выполняет сравнение конструкторов, поскольку это не работает в ситуациях между областями (например, дочернее окно, вызывающее функцию через top ). (По крайней мере, раньше это не работало.)

2. @Pointy — это все еще не так, хороший момент. Node.js коду могут сойти с рук некоторые вещи, недоступные браузерному коду (я не могу сразу придумать, как вы могли бы получить ссылку на объект между областями в Node.js ), но… Я бы отметил это в обзоре кода. 🙂