2015-10-11 2 views
0

Я пытаюсь хэш-файл с помощью crypto в nodejs. Вот что я сделал еще.Hasing файл больше, чем RAM в NodeJS

// generate a hash from file stream 
    var crypto = require('crypto'), 
     fs = require('fs'), 
     key = 'hehe'; 

    // open file stream 
    var fstream = fs.createReadStream('path/to/file'); 
    var hash = crypto.createHash('sha512', key); 
    hash.setEncoding('hex'); 

    // once the stream is done, we read the values 
    fstream.on('end', function() { 
     hash.end(); 
     // print result 
     console.log(hash.read()); 
    }); 

    // pipe file to hash generator 
    fstream.pipe(hash); 

Все работает хорошо, но мне интересно, что будет, если файл я хочу хэширования будет больше, чем моя RAM?

Теоретически сейчас программа должна потерпеть крах, если файл будет больше, чем RAM. Моя текущая оперативная память - 10gb, и у меня нет файла большего размера, чем 10gb для тестирования.

+0

Это файл _stream_, поэтому содержимое файла будет передаваться в виде блоков в хеширующую утилиту. Это будет отлично для файла, большего, чем то, что может поместиться в ОЗУ. – rafalio

+0

@rafalio Что вы подразумеваете под файловым потоком? – Chris

ответ

0

Ввода в простую концепцию:

Вашего fstream является читателем потока, он будет читать ваш файл на небольшие блоки фиксированного размера, и ваш hash будет строить sha512 хэш строку от небольших блоков файла. Ваша программа не содержит весь файл в ram, он читает небольшие фрагменты, генерирует хеш-дайджест, вытесняет их из RAM и читает следующие фрагменты данных.

Если вы хотите протестировать это, сгенерируйте файл 10GB fallocate -l 10G 10gbtest.img и запустите свой скрипт против этого файла.

Смежные вопросы