Python utilizza un seme hash casuale per impedire agli aggressori di eseguire il tar-pitting della tua applicazione inviandoti chiavi progettate per collidere. Vedere l' informativa sulla vulnerabilità originale . Compensando l'hash con un seme casuale (impostato una volta all'avvio) gli aggressori non possono più prevedere quali chiavi entreranno in collisione.
È possibile impostare un seme fisso o disabilitare la funzionalità impostando la PYTHONHASHSEED
variabile d'ambiente ; il valore predefinito è random
ma puoi impostarlo su un valore intero positivo fisso, 0
disabilitando completamente la funzione.
Le versioni 2.7 e 3.2 di Python hanno la funzione disabilitata per impostazione predefinita (usa l' -R
interruttore o impostalo PYTHONHASHSEED=random
per abilitarlo); è abilitato per impostazione predefinita in Python 3.3 e versioni successive.
Se ti affidi all'ordine delle chiavi in un set Python, allora non farlo. Python utilizza una tabella hash per implementare questi tipi e il loro ordine dipende dalla cronologia di inserimento ed eliminazione , nonché dal seme di hash casuale. Nota che in Python 3.5 e versioni precedenti, questo vale anche per i dizionari.
Vedere anche la object.__hash__()
documentazione del metodo speciale :
Nota : per impostazione predefinita, i __hash__()
valori di str, byte e oggetti datetime sono "salati" con un valore casuale imprevedibile. Sebbene rimangano costanti all'interno di un singolo processo Python, non sono prevedibili tra invocazioni ripetute di Python.
Questo ha lo scopo di fornire protezione contro un denial-of-service causato da input scelti con cura che sfruttano le prestazioni nel caso peggiore di un inserimento di dict, O (n ^ 2) complessità. Vedi http://www.ocert.org/advisories/ocert-2011-003.html per i dettagli.
La modifica dei valori hash influisce sull'ordine di iterazione di dict, set e altre mappature. Python non ha mai fornito garanzie su questo ordine (e in genere varia tra build a 32 bit e 64 bit).
Vedi anche PYTHONHASHSEED
.
Se hai bisogno di un'implementazione hash stabile, probabilmente vorrai guardare il hashlib
modulo ; questo implementa le funzioni hash crittografiche. Il progetto pybloom utilizza questo approccio .
Poiché l'offset è costituito da un prefisso e un suffisso (valore iniziale e valore XORed finale, rispettivamente) non è possibile memorizzare l'offset, sfortunatamente. Tra i lati positivi, ciò significa che gli attaccanti non possono facilmente determinare l'offset con gli attacchi a tempo.