2010-12-30 7 views
4

Wir verwenden UUIDs für unsere Primärschlüssel in unserem db (generiert von php, gespeichert in mysql). Das Problem ist, dass jemand, der etwas bearbeiten oder sein Profil ansehen möchte, diese riesige, gruselige, hässliche Uuid-Zeichenfolge am Ende der URL hat. (edit? id = .....)Ist es sicher, eine UUID in einen Funktionscode umzuwandeln? (nur die ersten 8 Zeichen verwenden)

Wäre es sicher (lies: immer noch einzigartig) wenn wir nur die ersten 8 Zeichen, alles vor dem ersten Bindestrich, benutzen?

Wenn es nicht sicher ist, gibt es eine Möglichkeit, es in etwas anderes zu übersetzen, das für die Verwendung in der URL verwendet wird, die in das Hex zurückübersetzt werden könnte, um es als Nachschlag zu verwenden? Ich weiß, dass ich Base64 es codieren kann, um es auf 22 Zeichen zu reduzieren, aber gibt es etwas noch kürzeres?

EDIT Ich habe gelesen this question und es sagte, Base64 zu verwenden. wieder, alles kürzer?

+0

Hoffen Sie, dass alle außer den ersten 8 Zeichen der UUID überflüssig sind? Sie sind da, um es einzigartig zu machen. Wie auch immer, wenn es 8 anstatt 22 Zeichen ist, glaubst du wirklich, dass das eine freundlichere Benutzererfahrung macht? Ich würde keine Zeit damit verbringen, mir darüber Gedanken zu machen. Ich habe verrückte URIs in der Adressleiste gesehen und die Usability der Site wird dadurch nicht beeinträchtigt. – webbiedave

+0

Ich dachte etwas Ähnliches wie ein MD5-Hash kann abgekürzt werden (lesen Sie dies irgendwo, aber nicht erinnern, wo), weil die Zeichen eine einheitliche Verteilung für eine bestimmte Teilzeichenfolge haben. – helloandre

+0

Ich verstehe. Von Crypto-Hash-Funktionen wird erwartet, dass sie akzeptable Kollisionshäufigkeiten aufweisen, und das Abschneiden der Ausgangszeichenfolge erhöht lediglich diese Wahrscheinlichkeit. Ihre Situation kann keine "Kollision" zulassen (eine ID weist auf zahlreiche Datensätze hin). – webbiedave

Antwort

4

Das Verkürzen der UUID erhöht die Wahrscheinlichkeit einer Kollision. Du kannst es tun, aber es ist eine schlechte Idee. Die Verwendung von nur 8 Zeichen bedeutet nur 4 Bytes an Daten, so dass Sie eine Kollision erwarten würden, sobald Sie etwa 2^16 IDs haben - weit entfernt von ideal.

Die beste Option besteht darin, die rohen Bytes der UUID (nicht die hexadezimale Darstellung) zu nehmen und sie mit base64 zu codieren. Oder machen Sie sich nur keine Sorgen, denn ich bezweifle ernsthaft, dass sich Ihre Nutzer darum kümmern, was in der URL steht.

1

Es ist nicht sicher, UUIDs abzuschneiden. Außerdem sind sie so konzipiert, dass sie weltweit einzigartig sind, so dass Sie kein Glück haben werden, sie zu verkürzen. Am besten ist es, jedem Benutzer eine eindeutige Nummer zuzuweisen oder die Benutzer einen benutzerdefinierten (eindeutigen) String (wie einen Benutzernamen oder Spitznamen) auswählen zu lassen, der entschlüsselt werden kann. Sie könnten edit? Id = .... oder edit? Name = blah haben und dann den Namen in Ihrem Skript in die UUID dekodieren.

+0

Die Auswahl der benutzerdefinierten Namen funktioniert, aber es wird nicht immer ein Benutzerprofil bearbeitet. könnte etwas sein, das ein Benutzer mit nichts einzigartig einzigartig (think photo album) anders als die UUID erstellt. – helloandre

0

Es hängt davon ab, wie Sie die UUID generieren - wenn Sie PHP uniqid verwenden, dann sind es die am weitesten rechts stehenden Ziffern, die "eindeutiger" sind. Wenn Sie jedoch die Daten kürzen, gibt es keine wirkliche Garantie, dass sie trotzdem eindeutig ist.

Unabhängig davon würde ich sagen, dass dies ein etwas suboptimaler Ansatz ist - gibt es keine Möglichkeit, eine eindeutige (und idealerweise sinnvolle) textuelle Referenzzeichenfolge anstelle einer ID in der Abfragezeichenfolge zu verwenden? (Schwer zu wissen ohne mehr Wissen über die Problemdomäne, aber es ist meiner Meinung nach immer ein besserer Ansatz, auch wenn SEO, usw. kein Faktor ist.)

Wenn Sie diesen Ansatz verwenden, könnten Sie auch lassen MySQL erzeugt die eindeutigen IDs, was wahrscheinlich ein wesentlich vernünftigerer Ansatz ist als der Versuch, dies in PHP zu handhaben.

1

Wenn Sie besorgt sind, Benutzer mit der UUID in der URL zu erschrecken, warum nicht stattdessen in ein verstecktes Formularfeld schreiben?

+0

Ich wollte einen Kompromiss zwischen dieser (nackten URL) und einem visuellen Hinweis in der URL von dem finden, was Sie gerade bearbeitet haben. könnte mit diesem Ansatz enden. – helloandre

3

Schneiden Sie kein einziges Bit aus dieser UUID heraus: Sie haben keine Kontrolle über den Algorithmus, der sie erzeugt hat, es gibt mehrere mögliche Implementierungen, die Implementierung des Algorithmus kann sich ändern (Beispiel: geändert mit der PHP-Version) Verwenden Sie)

Wenn Sie mich fragen, eine UUID in der Adressleiste sieht nicht erschreckend oder schwierig überhaupt, sogar eine einfache Google-Suche nach "UUID" produziert schlechtesten URLs, und jeder ist es gewohnt, auf Google URLs zu sehen!

Wenn Sie eine schönere URL suchen, werfen Sie einen Blick auf die Adressleiste dieses Artikels von stackoverflow.com. Sie verwenden die Artikel-ID, gefolgt vom Titel der Frage.Nur der ID-Teil ist relevant, alles andere ist da, um es den Lesern leicht zu machen (mach weiter und probiere es aus, du kannst alles nach der ID löschen, du kannst es durch Junk ersetzen - egal).

Verwandte Themen