diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | string.c | 14 |
2 files changed, 15 insertions, 4 deletions
@@ -1,3 +1,8 @@ +Tue Jan 20 13:03:50 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * string.c (hash): fixed the tail bytes handling in the aligned + access case. + Tue Jan 20 09:26:05 2009 NAKAMURA Usaku <usa@ruby-lang.org> * ext/nkf/nkf-utf8/nkf.c (nkf_buf_push): maybe a bug. @@ -1874,11 +1874,13 @@ rb_str_concat(VALUE str1, VALUE str2) return rb_str_append(str1, str2); } -#if defined __i386__ || defined _M_IX86 -#define UNALIGNED_WORD_ACCESS 1 +#ifndef UNALIGNED_WORD_ACCESS +# if defined __i386__ || defined _M_IX86 +# define UNALIGNED_WORD_ACCESS 1 +# endif #endif #ifndef UNALIGNED_WORD_ACCESS -#define UNALIGNED_WORD_ACCESS 0 +# define UNALIGNED_WORD_ACCESS 0 #endif /* MurmurHash described in http://murmurhash.googlepages.com/ */ @@ -1998,6 +2000,9 @@ hash(const unsigned char * data, int len, unsigned int h) t = (t >> sr) | (d << sl); #endif +#if MURMUR == 2 + if (len < align) goto skip_tail; +#endif h = murmur_step(h, t); data += pack; len -= pack; @@ -2014,7 +2019,7 @@ hash(const unsigned char * data, int len, unsigned int h) } t = 0; - switch(len) { + switch (len) { #ifdef WORDS_BIGENDIAN case 3: t |= data[2] << CHAR_BIT; @@ -2033,6 +2038,7 @@ hash(const unsigned char * data, int len, unsigned int h) #if MURMUR == 1 h = murmur_step(h, t); #elif MURMUR == 2 + skip_tail: h ^= t; h *= MurmurMagic; #endif |