2010-03-12 35 views
26

Ich sehe einige Implementierungen der einzigartigen String-Generierung für Dinge wie hochgeladene Bildnamen, Sitzungs-IDs, usw., und viele von ihnen verwenden die Verwendung von Hashes wie SHA1 oder andere.Python - Warum etwas anderes als uuid4() für eindeutige Strings verwenden?

Ich frage nicht die Legitimität der Verwendung von benutzerdefinierten Methoden, sondern nur der Grund. Wenn ich eine eindeutige Zeichenfolge möchte, sage ich einfach folgendes:

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

Und ich bin damit fertig. Ich war nicht sehr vertrauensvoll, bevor ich auf UUID lesen, so dass ich tat dies:

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

Nicht ein Repeater (ich würde man jetzt nicht erwarten, dass angesichts der Chancen sind wie 1.108e + 50, aber es ist beruhigend zu Sehen Sie es in Aktion). Sie könnten sogar die Hälfte der Chancen durch nur Ihre Zeichenfolge durch die Kombination 2 uuid4() s.

Also, mit dem gesagt, warum Menschen verbringen Zeit auf Random() und andere Sachen für einzigartige Saiten, etc? Gibt es ein wichtiges Sicherheitsproblem oder anderes bezüglich Uuid?

+11

BTW, verdoppelt die Länge der Uuid würde die Anzahl der möglichen Werte, nicht nur verdoppeln. –

Antwort

19

Mit einem Hash zur eindeutigen Identifizierung einer Ressource können Sie eine "eindeutige" Referenz aus dem Objekt generieren. Zum Beispiel verwendet Git SHA-Hashing, um einen eindeutigen Hash zu erstellen, der den genauen Änderungssatz eines einzelnen Commits darstellt. Da Hashing deterministisch ist, erhalten Sie jedes Mal den gleichen Hash für dieselbe Datei.

Zwei Personen auf der ganzen Welt könnten dieselbe Änderung unabhängig vom selben Repo vornehmen, und Git würde wissen, dass sie die gleiche Änderung vorgenommen haben. UUID v1, v2 und v4 können das nicht unterstützen, da sie keine Beziehung zur Datei oder zum Inhalt der Datei haben.

+1

Einspruch! UUIDs können deterministisch sein! UUIDv3 basiert auf einem MD5-Hash und UUIDv5 basiert auf einem SHA-1-Hash. – starlocke

+13

Man sollte UUIDv3 oder UUIDv5 für deterministische Dinge auswählen (hochgeladene Dateien, git changesets usw.), und man sollte UUIDv1, UUIDv2 oder UUIDv4 für vorübergehende, nicht deterministische (Sitzungen, temporäre Dateien usw.) auswählen. – starlocke

+0

BTW Git enthält Autor Info und Commit-Datum in Changesets, so dass die gleichen Änderungen von verschiedenen Menschen nicht den gleichen Hash erzeugen. Die im '.git'-Ordner gespeicherten Objektdateien sind jedoch ein gültiger Anwendungsfall. –

5

Ein möglicher Grund ist, dass die eindeutige Zeichenfolge für Menschen lesbar sein soll. UUIDs sind einfach nicht zu lesen.

11

Nun, manchmal wollen Sie Kollisionen. Wenn jemand das gleiche Bild zweimal hochlädt, möchten Sie ihm vielleicht lieber mitteilen, dass es sich um ein Duplikat handelt, anstatt nur eine Kopie mit einem neuen Namen zu erstellen.

+0

@Ben, Würden Sie nicht einfach den Bildnamen als ein anderes Feld in der Zeile speichern und die Programmierlogik verwenden, um das vorhandene Bild zu überschreiben, oder "oops" sagen, wenn sie das gleiche Bild erneut hochladen. – orokusaki

+0

Sein Punkt ist immer noch gültig: manchmal wollen Sie Kollisionen, und GUIDs bieten sie nicht an. Nachdem gesagt, dass jemand, der SHA-1 verwendet, um eine * eindeutige * Zeichenfolge zu finden, wahrscheinlich etwas falsch macht, da seine Ausgabe ist sicherlich weniger einzigartig als seine Eingabe. – ladenedge

+0

@ladenedge Ich denke, die SHA1 ist Teil der Gleichung, nur um einen normalisierten Wert (im Falle, dass Leerzeichen, usw.). – orokusaki

3

UUIDs sind lang und bedeutungslos (wenn Sie beispielsweise nach UUID bestellen, erhalten Sie ein bedeutungsloses Ergebnis).

Und weil es zu lang ist, würde ich es nicht in eine URL einfügen oder es dem Benutzer in irgendeiner Form oder Form offen legen.

+1

Ja, aber das ist [Shortuuid] (https://github.com/stochastic-technologies/shortuuid) für. Die ganze Entropie, keine Langeweile. –

1

Zusätzlich zu den anderen Antworten sind Hashes wirklich gut für Dinge, die unveränderlich sein sollten. Der Name ist einzigartig und kann verwendet werden, um jederzeit die Integrität von allem zu überprüfen, an das er angehängt ist.

1

Beachten Sie auch, dass andere Arten von UUID sogar angemessen sein könnten. Wenn Sie beispielsweise möchten, dass Ihre Kennung bestellbar ist, basiert UUID1 teilweise auf einem Zeitstempel. Alles dreht sich wirklich um Ihre Anwendungsanforderungen ...

Verwandte Themen