diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-01-23 02:36:50 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-01-23 02:36:50 +0000 |
commit | 059ea6e4d8233606d7dd522155744501b274acd4 (patch) | |
tree | 5f566d568fa09d85ad8e732f0d36167a53bed788 /st.c | |
parent | 51efda1ef3f17ff87e23d56bb40939d90b0e921c (diff) |
hash.c: move Hash specific functions
* hash.c (rb_ident_hash): move compare_by_identity specific
function from st.c.
* hash.c (rb_ident_hash_new): ditto from thread.c.
* st.c (st_numhash): remove ruby's Hash specific implementation.
* thread.c (recursive_list_access): use rb_ident_hash_new().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49386 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'st.c')
-rw-r--r-- | st.c | 24 |
1 files changed, 2 insertions, 22 deletions
@@ -1750,26 +1750,6 @@ st_numcmp(st_data_t x, st_data_t y) st_index_t st_numhash(st_data_t n) { - /* - * This hash function is lightly-tuned for Ruby. Further tuning - * should be possible. Notes: - * - * - (n >> 3) alone is great for heap objects and OK for fixnum, - * however symbols perform poorly. - * - (n >> (RUBY_SPECIAL_SHIFT+3)) was added to make symbols hash well, - * n.b.: +3 to remove ID scope, +1 worked well initially, too - * - (n << 3) was finally added to avoid losing bits for fixnums - * - avoid expensive modulo instructions, it is currently only - * shifts and bitmask operations. - * - flonum (on 64-bit) is pathologically bad, mix the actual - * float value in, but do not use the float value as-is since - * many integers get interpreted as 2.0 or -2.0 [Bug #10761] - */ -#ifdef USE_FLONUM /* RUBY */ - if (FLONUM_P(n)) { - n ^= (st_data_t)rb_float_value(n); - } -#endif - - return (st_index_t)((n>>(RUBY_SPECIAL_SHIFT+3)|(n<<3)) ^ (n>>3)); + enum {s1 = 11, s2 = 3}; + return (st_index_t)((n>>s1|(n<<s2)) ^ (n>>s2)); } |