JavaScriptで学ぶ関数型プログラミングを読書中に、某所で盛り上がってた6桁の数値のmd5値を作成するコードを、練習がてらに書いたよ。
forとかeach書いたら負けだと思って書いた。
性能は残念ながらでてない。
var _ = require('underscore');
_.mixin(require('underscore.string').exports());
var crypto = require('crypto');
// log output function
var log = (function(msg){
var base = new Date().getTime(); // start time
return function(msg){
var now = new Date().getTime();
console.log([msg, ':', now - base, 'msec'].join(''));
base = now;
};
})();
// master data
var salt = 'hoge$';
var hash = '4b364677946ccf79f841114e73ccaf4f';
log("inited");
// create input data '000000'-'999999'
var passes = _.map(_.range(0,1000000), function(n){return _.pad(n,6,'0');});
log("created data");
// passes -> hashes(md5)
var hashes = _.map(
passes, function(src){
var md5 = crypto.createHash('md5');
md5.update(salt + src, 'utf8');
return md5.digest('hex');
});
log("hashed alldata");
// key:hash value:pass
var dict = _.object(hashes,passes);
log("dicted, pass is " + dict[hash]);
実行結果
$ node md5.js
inited:0msec
created data:707msec
hashed alldata:3835msec
dicted, pass is 567890:679msec
まぁ性能出すための戦いじゃないけどおそい。
入力データの作成だけで700msec、
MD5の計算で4000msec、
それをオブジェクトへ詰めるだけで700msec…
関数型に慣れるための習作だしもうこれでいいよね。