/ / Perché Ruby ha un FixNum da nn a 2n + 1? - rubino, hash

Perché Ruby hash un FixNum n a 2n + 1? - rubino, hash

Perché Ruby ha un intero con hash n a 2 * n + 1?

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

Vedo che non devi sempre averlohash complicati, specialmente per oggetti semplici. Ma perché la regola "raddoppia e aggiungi 1" invece di fare ciò che fa Python, ovvero hash intero a se stessi?

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

C'è una ragione?

risposte:

5 per risposta № 1

I numeri interi sono oggetti, quindi hanno un object_id. Ma c'è un numero infinito di numeri interi. Apparentemente, non c'è spazio per altri oggetti. Come lo fa Ruby?

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

Produzione:

1
3
5
7
9
11
13
15
17
19

I numeri interi prendono tutti i dispari object_id "s, il resto digli oggetti vanno in mezzo, usano i numeri pari. La conversione da object_id (e hash) in intero (e viceversa) è molto semplice: tagliare 1 bit all'estrema destra (o aggiungerlo).