A partire da Python 3.3, l'algoritmo di hashing è in modo non deterministico salted per evitare un determinato tipo di attacco. Questo è utile per i server Web, ma è un problema quando si tenta di eseguire il debug di un programma: Ogni volta che eseguo il mio script, i contenuti di dettato vengono ripetuti in un ordine diverso.Disabilitare la randomizzazione dell'hash dal programma python
Alcune versioni precedenti di Python avevano una bandiera -R
per consentendo hash randomizzazione, ma ora che è il comportamento di default, la bandiera non è stato sostituito dal suo opposto. randomizzazione può essere disabilitato impostando la variabile di ambiente PYTHONHASHSEED
:
PYTHONHASHSEED
Se questa variabile non è impostata o impostata casuale, un valore casuale viene utilizzato per inizializzare le hash di str, byte e oggetti datetime.
Se PYTHONHASHSEED è impostato su un valore intero, viene utilizzato come seme fisso per generare l'hash() dei tipi coperti dalla casualità dell'hash.
Il problema è che questa variabile deve essere impostata prima di avviare il processo python. Ho provato a impostarlo con os.putenv()
o in os.environ
, ma questi sembrano non avere alcun effetto sul metodo di hashing. Questo non è troppo sorprendente: non mi aspetterei che Python verifichi l'ambiente prima di ogni singolo set o ricerca del dizionario! Quindi, la domanda rimane:
C'è un modo per un programma python di disabilitare la propria randomizzazione dell'hash?
Avrebbe dovuto accadere prima viene eseguito alcun codice Python vero e proprio; a quel punto, troppe stringhe sono state sottoposte a hash e collocate in elementi come type e module '__dict__'s. – user2357112
Ho pensato lo stesso; ma spero che qualcuno che ne sa di più possa commentare. – alexis
Questi sono i commit rilevanti: [f4b7ecf8a5f8] (https://hg.python.org/cpython/rev/f4b7ecf8a5f8) e [6b7704fe1be1] (https://hg.python.org/cpython/rev/6b7704fe1be1) - gettare uno sguardo attraverso di esso non vedo immediatamente una soluzione, ma è un punto di partenza. – dimo414