爲什麼Ruby的散列一個整數n
到2 * 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]
是否有原因?
爲什麼Ruby的散列一個整數n
到2 * 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]
是否有原因?
整數都是對象,所以他們有一個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位(或添加它)。
是不是相同的Ruby 1.9? – 2012-02-09 21:39:20
所以它基本上是希爾伯特酒店的對象id。 ;-) – 2012-02-09 21:40:54
@Michael Kohl:有人想到Cantor的名字出現了。我猜這對他們的聰明是意想不到的實際應用。 – steenslag 2012-02-09 21:49:14
您使用的是什麼版本的紅寶石? – 2012-02-09 21:24:06
我有在ruby19一個非常不同的輸出在Linux上:'-4507979699089292723 -2858483109482119521 -3969476086452127319 2371950802045904379' – 2012-02-09 21:26:06
紅寶石1.8.7(2010-01-10 PATCHLEVEL 249)萬向darwin11.0] – 2012-02-09 21:26:09