2012-02-27

NODE.JS : 파일 MD5SUM 구하기

기본 모듈 crypto 를 이용해서 파일의 md5sum 을 구하는 스크립트를 만들어보자. 별도로 제공이 안되므로 직접 만들어써야 한다. 일단 아래와 같이 만들어보면 md5 뿐만 아니라 sha1 에 대한 checksum 을 쉽게 구할 수도 있을 것이다.
  • 동기IO를 이용한 방법 (파일을 조금씩 읽어서 처리하는 방법) => Windows 에서는 에러가 발생하고 제대로 실행되지 않는다. 원인을 찾아보려고 했으나, 알 수가 없다. 혹시 누구 아시는분? node.js v0.6.11 에서 문제가 있었으나, v0.6.12 에서 잘 되고 있다.
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
    function md5sum(filename) {
      var genChecksum = null;
      var checksum = crypto.createHash('md5');
      var bytesRead = 1;
      var pos = 0
      var buffer = new Buffer(1024*64); // 64Kbyte
      var fd = fs.openSync(filename, 'r');
      var data = null;
      while (bytesRead > 0) {
        bytesRead = fs.readSync(fd, buffer, 0, buffer.length, pos);
        pos += bytesRead;
        if (bytesRead === buffer.length) {
          checksum.update(buffer);
        } else {
          data = buffer.slice(0, bytesRead);
          checksum.update(data);
        }
      }
      fs.closeSync(fd);
      genChecksum = checksum.digest('hex');
      return genChecksum;
    }
    
    console.log('checksum is : ' + md5sum(filename));
    
  • 동기IO를 이용한 방법 (파일은 한번에 읽어서 처리하는 방법) ⇒ 주의 : 한번에 큰 파일을 읽어서 처리하므로, 메모리를 많이 소모하게 될 것이다.
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
     
    function md5sum(filename) {
      var genChecksum = null;
      var checksum = crypto.createHash('md5');
      var data = fs.readFileSync(filename);
      checksum.update(data);
      genChecksum = checksum.digest('hex');
      return genChecksum;
    }
     
    console.log('checksum is : ' + md5sum(filename));
    
  • 비동기IO를 이용한 방법
    var fs     = require('fs');
    var crypto = require('crypto');
     
    var filename = 'walk_test.js';
    var genChecksum = null;
    var checksum = crypto.createHash('md5');
    var fin = fs.ReadStream(filename);
    fin.on('data', function(data){
      checksum.update(data);
    });
     
    fin.on('end', function(){
      genChecksum = checksum.digest('hex');
      console.log('checksum is : ' + genChecksum);
    });
    

댓글 없음:

댓글 쓰기