新井です。
そういえば、1.6 の hash.c rb_any_hash() で、
if (!FIXNUM_P(hval)) {
hval = rb_funcall(hval, '%', 1, INT2FIX(65439));
}
となってますが、65439 というのはどこから来た数値なんでしょう?
$ ruby -rmathn -e 'p 65439.prime_division'
[[3, 2], [11, 1], [661, 1]]
っと素数じゃないですよねえ。1.7 では、以下のように昔のまま
です。
DEFER_INTS;
hval = rb_funcall(a, id_hash, 0);
if (FIXNUM_P(hval)) {
hval %= 536870917;
}
else {
hval = rb_funcall(hval, '%', 1, INT2FIX(536870917));
}
ENABLE_INTS;
$ ruby -rmathn -e 'p 536870917.prime_division'
[[11, 1], [103, 1], [613, 1], [773, 1]]
こっちも素数じゃない。以前、st.c の primes を素数に直して頂
きましたがこっちも直した方がいいんじゃないかな?
--
新井康司 (Koji Arai)