2012-02-09 5 views
4

なぜRubyが整数をハッシュするのですかn2 * n + 1なぜRubyはFixNum nを2n + 1にハッシュしますか?

>> [0,1,2,3].each {|x| puts x.hash} 
1 
3 
5 
7 

特に単純なオブジェクトの場合、複雑なハッシュを持つ必要はありません。だが、なぜPythonがやっていることをするのではなく、整数をハッシュ化するのとは対照的に、 '倍精度浮動小数点型1を追加する'

>>> map(hash,[0,1,2,3]) 
[0, 1, 2, 3] 

理由はありますか?

+0

あなたはどのバージョンのルビーを使用していますか? –

+0

私はLinux上でruby19で非常に異なる出力を持っている: '-4507979699089292723 -2858483109482119521 -3969476086452127319 2371950802045904379' –

+0

ルビー1.8.7(2010-01-10パッチレベル249)[ユニバーサル-darwin11.0] –

答えて

5

整数はオブジェクトなので、object_idを持ちます。しかし、無限の整数があります。一見、他のオブジェクトのための余地はありません。 Rubyはどのようにこれを解消しますか?

10.times{|i| puts i.object_id} 

出力:

1 
3 
5 
7 
9 
11 
13 
15 
17 
19 

整数がすべての奇数OBJECT_ID年代を取る、オブジェクトの残りの部分は、彼らが偶数番号を使用し、間に入ります。 object_id(およびハッシュ)から整数(およびその逆)への変換は非常に簡単です。右端の1ビットを切り捨てる(または追加する)。

+0

と似たような結果になるのは、Ruby 1.9でも同じですか? –

+5

それは基本的にオブジェクトIDのヒルベルトのホテルです。 ;-) –

+0

@Michael Kohl:いくつかの考えの後に名前がカンタールが登場しました。私はこれが思いがけなく実用的に使用されていると思います。 – steenslag

関連する問題