モルと申します。
以下の環境で再現してみました。結論から言うとhashを繰り返して呼び出しても変更はありませんでした。
そしてBignumの範囲についてもYuguiさんがおっしゃったのと少しは違うところがあるようです。
~$ uname -a
SunOS kaeko 5.11 snv_111b i86pc i386 i86pc Solaris
~$ isainfo -n
amd64 #=> 基本的に64bitと環境で動いています。
~$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-solaris2.11] #=> p72なのでp174と何とか違うところがあるかもと思います。
ここから再現です。
~$ irb --simple-prompt
>> h = {:a => 2**61}
=> {:a=>2305843009213693952}
>> h.hash
=> -1073410747
>> h.hash
=> -1073410747
>> h.hash
=> -1073410747
>> h.hash
=> -1073410747
>> h.hash
=> -1073410747
>> h.hash
=> -1073410747 #=> 変更なしです
>> (2**61).class
=> Bignum #=> YuguiさんのマシンではFixnumでした
>> (2**62).class
=> Bignum
>> (2**62 - 1).class
=> Bignum
>> (2*61 -1).class
=> Fixnum #=> 私の環境ではここまでがBignumであるらしいです
>> h1 = {:a => 2**61}
=> {:a=>2305843009213693952}
>> h2 = {:a => 2**61}
=> {:a=>2305843009213693952}
>> h1 == h2
=> true #=> falseだったところが私の環境ではなぜかtrue
>> h1.class == h2.class
=> true
>> h1.hash
=> -1073410747
>> h1.hash
=> -1073410747
>> h2.hash
=> -1073410747
>> h2.hash
=> -1073410747
という風にちょこっとやってみましたが、これってpatch levelによるものかそれとも実行環境(OpenSolaris)によるものかはよくわかりませんでした。実行環境への依存性があるってことでしょうか。
--
MORU <
lateau@...>
2009/11/5 Yuki Sonoda
<redmine@...>
Bug #2338: 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる
http://redmine.ruby-lang.org/issues/show/2338
起票者: Yuki Sonoda
ステータス: Open, 優先度: High
ruby -v: ruby 1.9.1p326 (2009-10-31 revision 25600) [i386-darwin9.8.0]
Yuguiです。1.9.1でも再現を確認しましたのでチケットをコピーします。
--
大きなFixnumを値にもつHashについてHash#hashの値が呼び出しごとに変わります。
% ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
% irb --simple-prompt
>> h = {:a => 2**61}
=> {:a=>2305843009213693952}
>> h.hash
=> 3933384
>> h.hash
=> 4179968
>> (2**61).class
=> Fixnum
>> (2**62).class
=> Bignum
関連してだと思うのですが
h1.eql? h2 # => true
であるにもかかわらず
h1.hash == h2.hash # => false
となることがあります。
https://trac.macports.org/ticket/22361
% irb --simple-prompt
>> {:a => 2**61}.eql?({:a => 2**61})
=> true
>> {:a => 2**61}.hash == {:a => 2**61}.hash
=> false
簡単に試してみたところ、値が2**61から2**62-1の範囲で起きるようです。
32bitの場合は2**29から2**30-1の範囲で同様の現象が発生します。
----------------------------------------
http://redmine.ruby-lang.org