Heaven's Kitchen

○ Hash

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の新譜買いました。

<< 前の日記 "帰省してました"(2007-08-19)

Valid XHTML 1.0! Valid CSS!