2012-02-09 42 views
4

爲什麼Ruby的散列一個整數n2 * n + 1爲什麼Ruby將FixNum n散列爲2n + 1?

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

我可以看到,你並不總是需要複雜的散列,特別是對於簡單的對象。但是,爲什麼'雙加1'規則與Python做的不同,就是將整數散列到自己呢?

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

是否有原因?

+0

您使用的是什麼版本的紅寶石? – 2012-02-09 21:24:06

+0

我有在ruby19一個非常不同的輸出在Linux上:'-4507979699089292723 -2858483109482119521 -3969476086452127319 2371950802045904379' – 2012-02-09 21:26:06

+0

紅寶石1.8.7(2010-01-10 PATCHLEVEL 249)萬向darwin11.0] – 2012-02-09 21:26:09

回答

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? – 2012-02-09 21:39:20

+5

所以它基本上是希爾伯特酒店的對象id。 ;-) – 2012-02-09 21:40:54

+0

@Michael Kohl:有人想到Cantor的名字出現了。我猜這對他們的聰明是意想不到的實際應用。 – steenslag 2012-02-09 21:49:14

相關問題