Hash value of { n => n }

e$B1sF#$H?=$7$^$9e(B

1.9 e$B$G0J2<$N%3!<%I$r<B9T$9$k$H!"$+$J$j;~4V$,$+$+$j$^$9!#e(B

$ time ./ruby -ve ‘h = {}; 10000.times {|x| h[{ x => x }] = 1 }’
ruby 1.9.0 (2007-09-15 patchlevel 0) [i686-linux]

real 0m12.369s
user 0m9.050s
sys 0m3.280s

e$BG$0U$Ne(B x e$B$K$D$$$Fe(B { x => x } e$B$N%O%C%7%eCM$,$9$Y$Fe(B 1
e$B$G$"$k$?$a!“e(B
e$B>WFM$7$^$/$C$F$$$k$h$&$G$9!#e(B
e$BBQ>WFM@-$O$=$l$[$I=EMW$8$c$J$$$+$b$7$l$^$;$s$,!”$A$g$C$H4JC1$Ke(B
e$B>WFM$7$9$.$J5$$b$7$^$9!#$I$&$G$7$g$&$+!#e(B

e$B>e$N%3!<%I$K$D$$$F$O0J2<$N%Q%C%A$G$H$j$"$($:2r7h$7$^$9!#e(B

Index: hash.c

— hash.c (revision 13472)
+++ hash.c (working copy)
@@ -1461,6 +1461,7 @@
{
if (key == Qundef) return ST_CONTINUE;
*hval ^= rb_hash(key);

  • *hval *= 137;
    *hval ^= rb_hash(val);
    return ST_CONTINUE;
    }

$ time ./ruby -ve ‘h = {}; 10000.times {|x| h[{ x => x }] = 1 }’
ruby 1.9.0 (2007-09-15 patchlevel 0) [i686-linux]

real 0m0.182s
user 0m0.030s
sys 0m0.150s