Domanda

Vedo uscire alcune implementazioni di generazione stringa univoca per le cose come i nomi di immagine caricata, ID di sessione, et al, e molti di loro impiegano l'utilizzo di hash SHA1 come, o altri.

Non sto mettendo in discussione la legittimità di utilizzare metodi personalizzati come questo, ma piuttosto solo la ragione. Se voglio una stringa univoca, dico solo questo:

>>> import uuid
>>> uuid.uuid4()
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d')

E ho finito con esso. Non ero molto fiducioso prima ho letto su UUID, quindi ho fatto questo:

>>> import uuid
>>> s = set()
>>> for i in range(5000000):  # That's 5 million!
>>>     s.add(str(uuid.uuid4()))
...
...
>>> len(s)
5000000

Non un ripetitore (non mi aspetto uno ora valutando le probabilità sono come 1.108e + 50, ma è confortante vedere in azione). Si potrebbe anche la metà delle probabilità di solo facendo la stringa combinando 2 uuid4()s.

Così, con quello detto, perché le persone passano il tempo su casuale () e altre cose per archi unici, ecc? C'è un importante problema di sicurezza o altro uuid riguardo?

È stato utile?

Soluzione

Utilizzo di un hash per identificare univocamente una risorsa permette di generare un riferimento 'unico' dall'oggetto. Per esempio, Git utilizza SHA hashing per fare un hash univoco che rappresenta l'esatto di modifiche di un solo un commit. Dal momento che l'hashing è deterministico, si otterrà lo stesso hash per lo stesso file ogni volta.

Due persone in tutto il mondo potrebbe fare la stessa modifica al medesimo pronti contro termine in modo indipendente, e Git avrebbero saputo che hanno fatto la stessa modifica. UUID v1, v2, e v4 non può sostenere che dal momento che non hanno alcuna relazione con il file o il contenuto del file.

Altri suggerimenti

Beh, a volte si desidera collisioni. Se qualcuno carica la stessa immagine esatta due volte, forse si preferisce dire loro che è un duplicato piuttosto che fare un'altra copia con un nuovo nome.

Una possibile ragione è che si desidera che la stringa univoca per essere leggibile. UUID solo che non sono di facile lettura.

UUID sono lunghi, e senza senso (per esempio, se ordinate da UUID, si ottiene un risultato privo di significato).

E, perché è troppo lungo, non vorrei metterlo in un URL o esporlo per l'utente in qualsiasi forma.

In aggiunta alle altre risposte, hash sono veramente buono per cose che dovrebbero essere immutabili. Il nome è unico e può essere utilizzato per controllare l'integrità di tutto ciò che è collegato a in qualsiasi momento.

Si noti inoltre altri tipi di UUID potrebbe anche essere appropriato. Ad esempio, se volete che il vostro identificativo per essere ordinabili, UUID1 si basa in parte su un timestamp. E 'tutto veramente i requisiti dell'applicazione ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top