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ď č. 1Celé čí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).