#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 ), но… Я бы отметил это в обзоре кода. 🙂