成瀬です。 KIMURA Koichi wrote: > 木村です。 > > 例によって報告だけです。 > > 01:53 Tuesday ruby > Commit by matz :: r15743 /trunk/ (ChangeLog string.c): > > * string.c (hash): replaced by MurmurHash described in <http://murmurhash.googlepages.com/>. > > この修正の結果、uint32_tやらその辺の定義がないコンパイラで > ビルドできなくなっています。 この時点では uint32_t でなく unsigned int なので実際に uint32_t になるのは r15760 ですね。 なにはともあれ r15762 でビルドは通るようになっていると思います。 ただ、MurmurHash の意図している機能は発揮されていなくて、 h 等も unsigned int でなく int32_t にする必要があると思います。 また、m の初期値が最新版では 0x7fd652ad から 0xc6a4a793 に変更されているので、 これも追従した方がいいでしょう。 さらに、align や pack は len と演算が行われるので、型をそろえた方がいいかもしれません。 --- string.c (revision 15762) +++ string.c (working copy) @@ -1697,20 +1697,21 @@ rb_str_concat(VALUE str1, VALUE str2) #endif /* MurmurHash described in http://murmurhash.googlepages.com/ */ -unsigned int -hash(const unsigned char * data, int len, unsigned int h) +uint32_t +hash(const unsigned char * data, long len, uint32_t h) { - const unsigned int m = 0x7fd652ad; + const unsigned int m = 0xc6a4a793; const int r = 16; h += 0xdeadbeef; if (len >= 4) { #if !UNALIGNED_WORD_ACCESS - int align = (VALUE)data & 3; + long align = (VALUE)data & 3; if (align) { uint32_t t = 0, d = 0; - int sl, sr, pack; + uint32_t sl, sr; + long pack; switch (align) { #ifdef WORDS_BIGENDIAN なお、この hash() は static がついていませんが、intern.h にも記述されていませんし、 他のファイルから使われている形跡もなく、名前が一般的なあたりから、 非公開を意図された関数だと推測したのですが、static のした方がいいのではないでしょうか。 -- NARUSE, Yui <naruse / airemix.com> DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA