xxhash というハッシュアルゴリズムがあり、パフォーマンス的には最速とのことである。
js でも幾つかライブラリが用意されているため、容易に使うことができる。
ということで簡単なコード書いて測ってみた。winston には profile 機能もあるとのことなので
それもついでに試してみる。。
比較するライブラリは xxhash と、 xxhashjs 最後に、crypto で SHA1 を作成してみて
100,000回ハッシュしてみた時間を測定していみる。
xxhash は、 C で記述されているので、スピーディなはず。
xxhashjs については、pureJS なライブラリで、ブラウザ上でも使うことができる。
var xxhashjs = require('xxhashjs'); var XXHash = require('xxhash'); var crypto = require('crypto'); var n = 100000; var winston = require('winston'); winston.profile('xxhash'); for (var i = 0; i < n; i++) { XXHash.hash(new Buffer('abcd'), 0x0108); } winston.profile('xxhash'); winston.profile('xxhashjs'); for (var i = 0; i < n; i++) { xxhashjs('abcd', 0x0108); } winston.profile('xxhashjs'); winston.profile('sha1'); for (var i = 0; i < n; i++) { crypto.createHash('sha1').update('abcd').digest('hex'); } winston.profile('sha1');
info: xxhash duration=162ms
info: xxhashjs duration=144ms
info: sha1 duration=439ms
文字数が少ないと、xxhashjs のほうが有利か。
では、文字数が 1,000文字のものをハッシュするとなるとどうなるか。
var xxhashjs = require('xxhashjs'); var XXHash = require('xxhash'); var crypto = require('crypto'); var n = 100000; var length = 1000; var winston = require('winston'); var randomstring = require('randomstring'); winston.profile('xxhash'); for (var i = 0; i < n; i++) { XXHash.hash(new Buffer(randomstring.generate(length)), 0x0108); } winston.profile('xxhash'); winston.profile('xxhashjs'); for (var i = 0; i < n; i++) { xxhashjs(randomstring.generate(length), 0x0108); } winston.profile('xxhashjs'); winston.profile('sha1'); for (var i = 0; i < n; i++) { crypto.createHash('sha1').update(randomstring.generate(length)).digest('hex'); } winston.profile('sha1');
info: xxhash duration=5107ms
info: xxhashjs duration=5324ms
info: sha1 duration=5216ms
若干、xxhashjs のほうが不利になるようだ。