[ruby-dev:39642] [Bug #2338] 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる

View: New views
4 Messages — Rating Filter:   Alert me  

[ruby-dev:39642] [Bug #2338] 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる

by Bryan McLellan-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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


[ruby-dev:39643] Re: [ruby-dev:39642] [Bug #2338] 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる

by Moru :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

モルと申します。

以下の環境で再現してみました。結論から言うと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



[ruby-dev:39644] Re: [ruby-dev:39643] Re: [ruby-dev:39642] [Bug #2338] 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる

by NARUSE, Yui-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

成瀬です。

2009/11/05 12:24, Moru wrote:

> モルと申します。
>
> 以下の環境で再現してみました。結論から言うとhashを繰り返して呼び出しても
> 変更はありませんでした。
> そしてBignumの範囲についてもYuguiさんがおっしゃったのと少しは違うところ
> があるようです。
>
> ~$ uname -a
> SunOS kaeko 5.11 snv_111b i86pc i386 i86pc Solaris
>
> ~$ isainfo -n
> amd64          #=> 基本的に64bitと環境で動いています。

たしかにシステムは amd64 なのでしょうが、

> ~$ ruby -v
> ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-solaris2.11] #=> p72なので
> p174と何とか違うところがあるかもと思います。

i386-solaris2.11 とあるので、
このバイナリは 32bit になっていると思われます。
これは configure のバグだろうか。

>  >> (2*61 -1).class
         ^ 累乗になっていません

--
NARUSE, Yui  <naruse@...>


[ruby-dev:39645] Re: [ruby-dev:39644] Re: [ruby-dev:39643] Re: [ruby-dev:39642] [Bug #2338] 大きなFixnumを値にもつHash#hashが呼び出しごとに変わる

by Moru :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

モルです。
ご指摘ありがとうございました。

2009/11/5 NARUSE, Yui <naruse@...>
成瀬です。

2009/11/05 12:24, Moru wrote:
モルと申します。

以下の環境で再現してみました。結論から言うとhashを繰り返して呼び出しても
変更はありませんでした。
そしてBignumの範囲についてもYuguiさんがおっしゃったのと少しは違うところ

があるようです。

~$ uname -a
SunOS kaeko 5.11 snv_111b i86pc i386 i86pc Solaris

~$ isainfo -n
amd64          #=> 基本的に64bitと環境で動いています。

たしかにシステムは amd64 なのでしょうが、


~$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-solaris2.11] #=> p72なので
p174と何とか違うところがあるかもと思います。

i386-solaris2.11 とあるので、
このバイナリは 32bit になっていると思われます。
これは configure のバグだろうか。

確かにそうですね。SUNWruby18を入れたものですので直接configureしたものはどうなっているかよくわかりません。
今度p72かp174で試してみます。
 

 >> (2*61 -1).class
       ^ 累乗になっていません


すみません。間違ってしまいました。
>> (2**61-1).class
Bignum

となります。
 
--
NARUSE, Yui  <naruse@...>