というわけでDigest::MurmurHashの内部にあった、ただ文字列を溜めておくだけのクラスを切り出して別GemのDigest::StringBufferとして、これを継承するようにした版を作りました。
またMurmurHash2Aアルゴリズムを追加。ハッシュ値を数字として取り出すrawdigest
の高速化も行いました。、20文字のランダムな文字列を1万回MurmurHash1でハッシュ値(数字)を取得する場合、pureRubyの場合に比べて約40倍高速に動作します。
$ bundle exec ruby spec/bench.rb
### condition RUBY_VERSION = 2.0.0 count = 100000 ### benchmark user system total real pureRuby 1.180000 0.010000 1.190000 ( 1.186776) Prime37 0.890000 0.010000 0.900000 ( 0.903354) MurmurHash1 0.030000 0.000000 0.030000 ( 0.029737) MurmurHash2 0.030000 0.000000 0.030000 ( 0.029815) MurmurHash2A 0.040000 0.000000 0.040000 ( 0.032749) ### real second rate (pureRuby/) 1.0/pureRuby 1.313744113603305/Prime37 39.90906950936544/MurmurHash1 39.8046620828442/MurmurHash2 36.23854163485908/MurmurHash2A ### confrict count (/100000) pureRuby: 2 Prime37: 652 MurmurHash1: 2 MurmurHash2: 0 MurmurHash2A: 0
これでそろそろ本題のDBM実装に入れるかな……。
リンク
https://rubygems.org/gems/digest-murmurhash
https://github.com/ksss/digest-murmurhash/blob/master/spec/bench.rb