/ / Prečo Ruby hash FixNum n na 2n + 1? - Ruby, hash

Prečo Ruby hash FixNum n na 2n + 1? - rubín, hash

Prečo Ruby hash celé číslo n na 2 * n + 1?

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

Vidím, že nemusíte mať vždyzložité hashe, najmä pre jednoduché objekty. Ale prečo pravidlo „zdvojnásobiť a pridať 1“ je na rozdiel od toho, čo robí Python, čo znamená hash celé čísla pre seba?

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

Existuje dôvod?

odpovede:

5 pre odpoveď č. 1

Celé čísla sú objekty, takže majú názov_objektu. Existuje však nekonečné množstvo celých čísel. Zdá sa, že nie je priestor pre iné objekty. Ako to Ruby stiahne?

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

Výkon:

1
3
5
7
9
11
13
15
17
19

Celé čísla berú všetky nepárne object_id ", zvyšokobjekty idú medzi nimi, používajú párne čísla. Konverzia z object_id (a hash) na celé číslo (a naopak) je veľmi jednoduchá: nasekajte 1 bit úplne vpravo (alebo ho pridajte).