diff options
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -919,13 +919,15 @@ rb_str_concat(str1, str2) return str1; } +static unsigned long hash_seed; + int rb_str_hash(str) VALUE str; { register long len = RSTRING(str)->len; register char *p = RSTRING(str)->ptr; - register int key = 0; + register unsigned long key = hash_seed; #if defined(HASH_ELFHASH) register unsigned int g; @@ -949,6 +951,7 @@ rb_str_hash(str) while (len--) { key = key*65599 + *p; p++; + key = (key << 13) | (key >> ((sizeof(unsigned long) * CHAR_BIT) - 13)); } key = key + (key>>5); #endif @@ -5413,4 +5416,6 @@ Init_String() rb_define_method(rb_cSymbol, "downcase", sym_downcase, 0); rb_define_method(rb_cSymbol, "capitalize", sym_capitalize, 0); rb_define_method(rb_cSymbol, "swapcase", sym_swapcase, 0); + + hash_seed = rb_genrand_int32(); } |