August 21, 2007
QDBMの次が出るとは,全然知らなかった。
Inside Tokyo Cabinet その壱 by 平林幹雄さん
このエントリ,初回だからか懇切丁寧に解説されていて勉強になります。続きが楽しみ。
中盤あたりに出てくるハッシュ関数だけど,こんな単純でいいんだねぇ。実用Perlプログラミングの初版によれば,Perl5の初期のころの実装ではハッシュ関数は
int i=klen;
unsigned int hash = 0;
char *s = key;
while (i--)
hash = hash * 33 + *s++;
のように実装されていると書いてある。平林さんの記事では31, 37あたりがいいんじゃないかと書いてあるけど,33(笑
結局なんでもいいってことか。
で,最近のPerlはどうなってるかと覗いてみると
#define PERL_HASH(hash,str,len) \
STMT_START { \
register const char *s_PeRlHaSh_tmp = str; \
register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
register I32 i_PeRlHaSh = len; \
register U32 hash_PeRlHaSh = PERL_HASH_SEED; \
while (i_PeRlHaSh--) { \
hash_PeRlHaSh += *s_PeRlHaSh++; \
hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
} \
hash_PeRlHaSh += (hash_PeRlHaSh << 3);\
hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
(hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
} STMT_END
hv.hの76行目。(stable.tar.gz perl-5.8.8)
全然ちゃうし。でも平林さんも言っている,シフトを使って高速にを実践した感じなのかな。XORの意図が全く読めん。
Kornの新譜買いました。
