From: matz@... (Yukihiro Matsumoto) Date: 2001-06-22T17:11:54+09:00 Subject: [ruby-talk:16755] Re: Symbols, and their use as hash keys Hi, In message "[ruby-talk:16753] Re: Symbols, and their use as hash keys" on 01/06/22, "Aristarkh A Zagorodnikov" writes: |> because "intern" is not free, I think. You called intern 10000 times |> once for each symbol. |The same stuff I did for string case, just not used them :) Oops... That was caused by a bad hash function defined in st.c Here's the patch. matz. --- st.c 2001/06/11 06:26:17 1.13.2.1 +++ st.c 2001/06/22 08:11:32 @@ -116,3 +116,3 @@ -#if 1 +#if 0 for (i=3; i<31; i++) { @@ -233,3 +233,3 @@ #define FIND_ENTRY(table, ptr, hash_val, bin_pos) \ -bin_pos = hash_val&(table)->num_bins;\ +bin_pos = hash_val%(table)->num_bins;\ ptr = (table)->bins[bin_pos];\ @@ -268,3 +268,3 @@ rehash(table);\ - bin_pos = hash_val & table->num_bins;\ + bin_pos = hash_val % table->num_bins;\ }\ @@ -311,3 +311,3 @@ hash_val = do_hash(key, table); - bin_pos = hash_val & table->num_bins; + bin_pos = hash_val % table->num_bins; ADD_DIRECT(table, key, value, hash_val, bin_pos); @@ -331,3 +331,3 @@ next = ptr->next; - hash_val = ptr->hash & new_num_bins; + hash_val = ptr->hash % new_num_bins; ptr->next = new_bins[hash_val]; @@ -557,3 +557,3 @@ { - return n/7; + return n; }