Я относительно новичок в JavaScript и хочу получить хэш файла, а также хотел бы лучше понять механизм и код этого процесса.
Итак, что мне нужно: хэш MD5 или SHA-256 загруженного на мой сайт файла.
Насколько я понимаю, это работает: файл загружается с помощью тега HTML input
типа "файл", после чего он преобразуется в двоичную строку, которая затем хешируется.
Что у меня есть на данный момент: мне удалось получить хеш ввода типа "текст", а также каким-то образом хэш загруженного файла, хотя хеш не совпадал с веб-сайтами, которые я посмотрел в Интернете, поэтому я предполагаю, что он хэшировал некоторые другие детали файла, а не двоичную строку.
Вопрос 1: Правильно ли я понимаю, как хешируется файл? То есть, хешируется ли это двоичная строка?
Вопрос 2: Как должен выглядеть мой код, чтобы загрузить файл, хэшировать его и отобразить результат?
Заранее спасибо.
1 ответ
В основном да, вот как это работает.
Но чтобы сгенерировать такой хеш, вам не нужно выполнять преобразование в строку самостоятельно. Вместо этого пусть SubtleCrypto API справится с этим самостоятельно, и просто передайте ArrayBuffer вашего файла.
async function getHash(blob, algo = "SHA-256") {
// convert your Blob to an ArrayBuffer
// could also use a FileRedaer for this for browsers that don't support Response API
const buf = await new Response(blob).arrayBuffer();
const hash = await crypto.subtle.digest(algo, buf);
let result = '';
const view = new DataView(hash);
for (let i = 0; i < hash.byteLength; i += 4) {
result += view.getUint32(i).toString(16).padStart(2, '0');
}
return result;
}
inp.onchange = e => {
getHash(inp.files[0]).then(console.log);
};
<input id="inp" type="file">
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.