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 № 1I 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).