Per molto tempo ho usato esclusivamente simboli per le chiavi degli
Hash,
senza approfondire mai la ragione per cui fosse preferibile rispetto
alla
stringa, a parte dover digitare un carattere in meno.
Ultimamente mi sto ponendo il quesito nuovamente, per via del fatto che
spesso quando si passano dati in giro, specie in formato json, quello
che
ritorna un hash con le chiavi in formato stringa.
C’ sempre li famoso symbolize_keys, ma mi chiedo se sia un passaggio
necessario o pi una conseguenza di una abitudine diffusa e non
corrispondente ad un bisogno reale.
Proprio per questo motivo in Rails params di tipo
ActiveSupport::HashWithIndifferentAccess, che fa si che ad un hash si
possa
accedere indifferentemente con simboli o con stringhe. ActiveSupport
implementa anche Hash#with_indifferent_access, utile per convertire un
Hash
ed accedervi indifferentemente con simboli o stringhe:
Per i simboli la velocita’ di accesso NON dipende dalla lunghezza della
key
(che ha un object_id immutabile)
Per le stringhe invece questo NON vale in quanto le stringhe sono
“mutabili” e non hanno un puntatore.
Prendiamo una libreria che parsa JSON, un oggetto JSON molto grande, e
lo
trasforma in un hash. O molti piccoli json. E’ indifferente, magari
rimangono in memoria per un tempo prolungato.
JSON.parse({a: 10}.to_json).keys
=> [“a”]
Questo un problema memory-wise da quello che stiamo dicendo, o sarebbe
peggio se venisse creato un Hash con simboli come chiavi?
Gli Hash con simboli vanno bene per la velocit di accesso, sono un
problema nel caso il numero di chiavi non sia noto a priori (sopratutto
se
le chiavi posso essere create dagli utenti: DOS attack)
Gli Hash con stringhe sono lenti in accesso ai dati: la velocita’
dipende dalla grandezza della chiave (quindi evito di usare stringhe
troppo
lunghe), ma le chiavi sono GC
Se uso JSON.parse le mia chiavi saranno simboli by default
ActiveSupport ha un metodo che ritira i valori usando come chiave
indifferentemente stringa o simbolo.
Vim e’ decisamente superiore a Emacs in tutto
Siamo daccordo?
Possiamo andare a casa che e’ venerdi?
Davide
Il giorno 21 novembre 2014 17:00, Fabrizio R. [email protected]
ha
scritto:
Gli Hash con simboli vanno bene per la velocit di accesso, sono un
problema nel caso il numero di chiavi non sia noto a priori (sopratutto se
le chiavi posso essere create dagli utenti: DOS attack)
…
Possiamo andare a casa che e’ venerdi?
solo se ammetti che 1) accade per ruby < 2.2 e ti converti a sublime.
Immagino che HashWithIndifferentAccess converta le stringhe in input in
simboli per poi eseguire il confronto e non il contrario.
Sbagliato: se HashWithIndifferentAccess convertisse stringhe in simboli
potresti dossare un’applicazione Rails (Ruby < 2.2) semplicemente
inviando
richieste con tante query string keys che, venendo convertite in simboli
da
Rails e non GCed, intaserebbero la memoria.
–
Maurizio De Santis
Il giorno 21 novembre 2014 15:58, Fabrizio R. [email protected]
ha
scritto:
Gli Hash con simboli vanno bene per la velocità di accesso, sono un
problema nel caso il numero di chiavi non sia noto a priori (sopratutto
se
le chiavi posso essere create dagli utenti: DOS attack)
E’ così. Ma: Ruby 2.2 a Natale e Rails 4.2 (quando?) risolveranno il
problema; nella maggior parte dei casi si sa quali sono le chiavi;
JSON.parse genera stringhe come chiavi.
Gli Hash con stringhe sono lenti in accesso ai dati: la velocita’
dipende dalla grandezza della chiave (quindi evito di usare stringhe
troppo lunghe), ma le chiavi sono GC
Sì.
Se uso JSON.parse le mia chiavi saranno simboli by default
Non è quel che fa il JSON.parse che sto usando io.
ActiveSupport ha un metodo che ritira i valori usando come chiave
indifferentemente stringa o simbolo.
Sì.
Vim e’ decisamente superiore a Emacs in tutto
Nel corso dei secoli ci sono state guerre combattute per questo.
Permettimi di considerare vim una nuova versione di vi e dopo 25 anni
che li uso ti posso solo dire che ognuno dei due ha i suoi punti di
forza. Da che vim ha uno scripting degno di tal nome lo si può usare
come fosse emacs. Per chi usa emacs da tempo è inutile fare switch e
immagino viceversa. Tipicamento uso vi per sudo vi /etc/qualcosa o sui
server in ssh. E’ più pratico.
Non aggrovigliamoci ulteriormente e restiamo su stringhe e hash
Buona domenica.