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 のほうが不利になるようだ。

富山。「とやま」ではない。「とみさん」である。

とみさんは、千葉を誇る低山であり、標高は349m。東京タワーより高く、東京スカイツリーよりは低い。僕は、こういう低い山。大好きだ。まず、無理しなくていい。登山登山している重装備は必要ない。とはいえ、一応山なので長袖のシャツや、伸縮性の良い長ズボンなどを装備する。その程度で良い。

友人と登る機会があったので行ってきたのだ。

この山は、『南総里見八犬伝』の舞台となっている山だそうで、この山の最寄りの駅である、岩井駅(内房線) の前には、そのストーリーの中に出てくる伏姫の像なんかが立ってたりする。残念ながら、こういう事前知識なしで、ただ「やまのぼろーぜー」というまるで小中学生のハイキングのような理由で向かうことにしたので、実際そういう物体がおいてあってもどうしたものか。と文化レベルの低い僕は考えたのだ。

これは、あとから調べた話だが『南総里見八犬伝』は、江戸時代に書かれたファンタジーな小説。Wikipediaのページを読んでも案内の、看板を読んでも ??? となってしまうくらいファンタジーなお話なのだ。

ルートとしては、岩井駅 -> 県道258号 -> 福満寺仁王門 -> 観音堂 -> さんちょー -> 伏姫籠穴 -> 県道258号 -> 岩井駅 という感じ。10km 程度である。

低い山といっても、結構階段が急なので、平坦な道を30km 歩くような場合と、違う筋肉をバリバリ使う感じがわかる。このブログでは山のことを話すつもりは無いので、山については別のページを見てほしい。

今回は、このエリアの面白かったトコロを伝えてきたいとおもう。

縁結びの鐘

2014-05-04 13.07.29

 

 

山頂付近には、ボタンスギの巨木があり、「縁結びの杉の木」として親しまれているそうな。

2014-05-04 13.07.35

横には、愛の鐘なるものが設置されている。昔、皇太子ご夫妻がここに訪れて有名になり、名所として設けた感じ。ところで、この案内板には、「地元有志 低名山倶楽部」の文字が。なにそれ入りたい。

千葉で一番高い山が、408m の愛宕山である。しかも、愛宕山は、自衛隊に申請しないと入れないゾーンにあったりするわけである。 なるほど。  「低名山」と誇るわけである。

伏姫籠穴の謎ファンタジー演出

今回ルート中にある、伏姫籠穴についてだが、ファンタジーさを演出するためのアトラクションが用意されている。

2014-05-04 13.49.34

まず、門。最近作りました感がある。こういう潔さは良い。「わざと汚く演出しました」みたいなのは一切感じられない。

2014-05-04 13.52.34

門の横には、説明が書いてあるのだが、おそらく論文からの引用がされている。

因果の理法の Complication

文学の論文は、こういう表現を普通に使うのだろうか。なんだろう、中二病感というか、大変気に入った。

2014-05-04 13.54.31

中!すごい整備されている!洋風ランプ!!!

籠穴の中には、なにやら白い球体が飾られていたり、『南総里見八犬伝』に出てくる、八犬士の珠なんかがゴロっとおいてあったりする。何かを召喚しそうな舞台があったりしたので、中二病ごっこも大変盛り上がる。おすすめの場所。

岩井駅付近は合宿所天国?

岩井駅付近は、スポーツな感じの合宿に使われているのか、運動場や体育館つきの合宿所なんかが沢山建っている。

「いとうRYO」 と 「いとう寮」なるものが存在して、面白かった。のちの机上調査によると、どうやら「いとうRYO」はスタジオがあったりする音楽合宿に向いた寮らしい。

2014-05-04 16.15.15

 

とにかく、狭い道を行ったり来たりしたい人には、なかなかおすすめな場所である。

海・山! 両方を楽しめる場所として

2014-05-04 15.22.39

駅から徒歩で行ける場所に海あり。山あり。そんな岩井駅ハイキング。

錦糸町から特急を使って、2時間もあれば行ける場所。なかなかおすすめです。

node.js アプリケーション上で、メモリキャッシュを使いたい場合、いくつかのライブラリが存在する。

memory-cache

Github: https://github.com/ptarjan/node-cache

npm install memory-cache

すごくシンプルに実装されている。どこから require('memory-cache') をしても、その中の情報は共有される実装。

node-cache

Github: https://github.com/tcs-de/nodecache

npm install node-cache

memory-cache の Github レポジトリは node-cache で、こちらは nodecache という名前で管理されている。ややこしい。CoffeScript で書かれている。memory-cache に比べると高機能で、require('node-cache') では、データがオブジェクトに閉じ込められているため、複数のメモリ空間を別々に定義することができる。

get は、コールバックで取得する必要があったりする。

lru-cache

Github: https://github.com/isaacs/node-lru-cache

npm install lru-cache

LRU (Least Recently Used) 方式でキャッシュを管理できるライブラリ。つまり、予め利用件数を定めておいて、使われない情報を削除することができる。メモリ容量を管理したい場合は必要そうなライブラリ。

こちらも、node-cache と同様に、複数の空間を管理することができそうだ。

早さとかを比べてみる

1,000,000 回の get/set を行った結果

  • memory-cache: 1,071 ms
  • node-cache: 269,424 ms
  • lru-cache: 4,731ms

node-cache は高機能なだけあって、遅い気がしますねー。。。(計測の仕方がダメだった可能性もあるけど、1件の状態でも10ms 以上かかってしまっている。) //TODO: 個人的には、lru-cache の set() に、キャッシュごとに expire を定められたら使えるなーと思ったりしました。