Prima di tutto, lasciami dire che non puoi garantire risultati unici. Se si desidera ottenere risultati univoci per tutte le stringhe nell'universo, è meglio memorizzare la stringa stessa (o una versione compressa).
Maggiori informazioni su questo in un secondo. Prendiamo prima alcuni hash.
modo hashlib
È possibile utilizzare uno dei principali hash crittografici per hash di una stringa con pochi passaggi:
>>> import hashlib
>>> sha = hashlib.sha1("I am a cat")
>>> sha.hexdigest()
'576f38148ae68c924070538b45a8ef0f73ed8710'
Avete una scelta tra SHA1, SHA224, SHA256, SHA384, SHA512, e MD5 per quanto riguarda i built-in.
Qual è la differenza tra questi algoritmi di hash?
Una funzione di hash funziona prendendo i dati di lunghezza variabile e trasformandoli in dati di lunghezza fissa.
La lunghezza fissa, nel caso di ciascuno degli algoritmi SHA incorporati in hashlib
, è il numero di bit specificato nel nome (con l'eccezione di sha1 che è 160 bit). Se si desidera una maggiore certezza che due stringhe non finiscano nello stesso bucket (stesso valore hash), selezionare un hash con un digest più grande (la lunghezza fissa).
in modo ordinato, questi sono i digest dimensioni si deve lavorare con:
Algorithm Digest Size (in bits)
md5 128
sha1 160
sha224 224
sha256 256
sha384 384
sha512 512
Più grande è il digerire meno è probabile che avrete una collisione, a condizione la funzione hash è degno.
Aspetta, che dire di hash()
?
La funzione integrata hash()
restituisce numeri interi, che potrebbero anche essere di facile utilizzo per lo scopo delineato. Ci sono problemi però.
>>> hash('moo')
6387157653034356308
Se il programma sta per essere eseguito su sistemi diversi, non si può essere sicuri che hash
tornerà la stessa cosa. In effetti, sto lavorando su una scatola a 64 bit usando Python a 64 bit. Questi valori saranno molto diversi da quelli di Python a 32 bit.
Per Python 3.3+, come @gnibbler sottolineato, hash()
è randomizzato tra le esecuzioni. Funzionerà per una sola esecuzione, ma quasi sicuramente non funzionerà su tutte le esecuzioni del tuo programma (tirando fuori dal file di testo che hai menzionato).
Perché lo standard hash()
deve essere costruito in questo modo? Bene, l'hash incorporato è lì per una ragione specifica. Hash tabelle/dizionari/cercare tabelle in memoria. Non per uso crittografico ma per ricerche a basso costo in fase di esecuzione.
Non utilizzare hash()
, utilizzare hashlib
.
Qual è il tuo ** problema ** reale? Ci sono molti algoritmi di hash, l'approccio bset dipende da come userete la stringa hash. –