2010-11-17 12 views
5

[Python 3.1]Python: come creare un hash di contenitori nidificati

Sto cercando di creare un hash per un contenitore che potrebbe aver nidificato contenitori in essa, con la profondità sconosciuta. A tutti i livelli della gerarchia, ci sono solo tipi built-in. Qual è un buon modo per farlo?

Perché ne ho bisogno:

sto cache il risultato di alcuni calcoli in un oggetto salamoia (su disco). Avrei bisogno di invalidare quel file memorizzato nella cache se la funzione è chiamata con parametri diversi (questo accade raramente, quindi non ho intenzione di salvare più di un file su disco). L'hash verrà utilizzato per confrontare i parametri.

+0

Ti aspetti che questi valori possano essere modificati dopo averli creati? – aaronasterling

+0

@aaronsterling: puoi chiarire per favore? Non sono sicuro di rispondere alla tua domanda, ma i contenitori o il loro contenuto non saranno modificati. Tuttavia, devo sottolineare che la persistenza è, ovviamente, necessaria per qualsiasi futura chiamata di questo programma Python (in un nuovo processo). – max

+0

Quindi stai bene con una piccola possibilità che il file non possa essere invalidato da diversi parametri di funzione? Qualsiasi funzione di hash avrà una possibilità di collisioni, quindi stai cercando una possibilità di collisione minima. Sto solo cercando di capire meglio il problema. –

risposta

1

Si potrebbe semplicemente serializzare i parametri in qualcosa come JSON e usarlo per l'hash.

+0

Mi piace questa idea. Ci sono problemi nascosti con quello? Ad esempio, si romperà su alcune complicate strutture di nidificazione, ecc.? – max

+0

No, fintanto che sono solo tuple, elenchi, ditali, strs e int che stai bene con esso. Un avvertimento, tuttavia: 'tuple' ==' list' (come JavaScript non ha un concetto 'tuple') –

+2

Penso che userei' pickle.dumps' invece di 'json.dumps'; il sottaceto è preciso con tipi e ~ 15% più veloce (li ho cronometrati). –

1

Se tutti i contenitori sono tuple e tutti gli oggetti contenuti sono lavabili, il contenitore principale deve essere lavabile.

+0

Buon punto. Sfortunatamente, tra i contenitori ci sono dizionari. – max

+1

È possibile convertire i dizionari in una tupla ordinata di tuple (chiave, valore). – Paul

0

Lo farei con serializzazione json come stringa [e poi cancellerò quella stringa se è ancora necessaria].

from simplejson import dumps 

def hash_data(data): 
    return hash(dumps(data)) 
Problemi correlati