Wie erstelle ich eindeutige IDs wie YouTube?

Lesezeit: 5 Minuten

Benutzeravatar von Digerdoden
Digerdoden

Ich habe mich immer gefragt, wie und warum sie das tun … ein Beispiel: http://youtube.com/watch?v=DnAMjq0haic

Wie werden diese IDs so generiert, dass es keine Duplikate gibt, und welchen Vorteil hat dies gegenüber einer einfachen automatisch inkrementierenden numerischen ID?

Wie kann man es kurz halten und trotzdem seine Einzigartigkeit bewahren? Die Zeichenfolge, die uniqid erstellt, ist ziemlich lang.

  • Eine ähnliche Diskussion findet hier statt: stackoverflow.com/questions/1075409/creating-your-own-tinyurl

    – Talljoe

    2. Juli 2009 um 19:25 Uhr

Benutzeravatar von chmac
chmac

Kevin van Zonneveld hat ein ausgezeichnetes geschrieben Artikel einschließlich einer PHP-Funktion, um genau dies zu tun. Sein Ansatz ist der beste, den ich bei der Recherche zu diesem Thema gefunden habe.

Seine Funktion ist ziemlich clever. Es verwendet eine feste $index-Variable, damit problematische Zeichen entfernt werden können (z. B. Vokale oder um eine Verwechslung von O und 0 zu vermeiden). Es hat auch die Möglichkeit, IDs zu verschleiern, damit sie nicht leicht zu erraten sind.

  • Ich wollte genau denselben Artikel auch als Antwort posten. das ist die beste lösung finde ich. Fragesteller, bitte akzeptieren Sie 1 als Antwort

    – ich bin dabei

    8. Juni 2012 um 4:45 Uhr

Benutzeravatar von DMCS
DMCS

Versuche dies: http://php.net/manual/en/function.uniqid.php

uniqid — Generiert eine eindeutige ID…

Ruft einen eindeutigen Bezeichner mit Präfix basierend auf der aktuellen Zeit in Mikrosekunden ab.

Vorsicht
Diese Funktion generiert keine kryptografisch sicheren Werte und sollte nicht für kryptografische Zwecke verwendet werden. Wenn Sie einen kryptografisch sicheren Wert benötigen, sollten Sie die Verwendung von in Betracht ziehen random_int(), random_bytes()oder openssl_random_pseudo_bytes() stattdessen.

Warnung
Diese Funktion garantiert nicht die Eindeutigkeit des Rückgabewerts. Da die meisten Systeme die Systemuhr durch NTP oder ähnliches anpassen, wird die Systemzeit ständig geändert. Daher ist es möglich, dass diese Funktion keine eindeutige ID für den Prozess/Thread zurückgibt. Verwenden more_entropy um die Wahrscheinlichkeit der Eindeutigkeit zu erhöhen …

base62 oder base64 kodieren den Wert Ihres Primärschlüssels und speichern ihn dann in einem anderen Feld.

Beispiel base62 für Primärschlüssel 12443 = 3eH

spart etwas Platz, weshalb ich mir sicher bin, dass YouTube es verwendet.

Wenn Sie eine base62 (A-Za-z0-9) -Codierung auf Ihrem PK oder einer eindeutigen Kennung vornehmen, wird der Aufwand vermieden, nachsehen zu müssen, ob der Schlüssel bereits vorhanden ist 🙂

Benutzeravatar von ivanakimov
Iwanakimov

Ich hatte ein ähnliches Problem – ich hatte primäre IDs in der Datenbank, aber ich wollte sie dem Benutzer nicht aussetzen – es wäre viel besser gewesen, stattdessen eine Art Hash anzuzeigen. Also schrieb ich Hashids.

Dokumentation: http://www.hashids.org/php/

Quelle: https://github.com/ivanakimov/hashids.php

Mit dieser Klasse erstellte Hashes sind eindeutig und entschlüsselbar. Sie können einen benutzerdefinierten Salt-Wert angeben, sodass andere Ihre Hashes nicht entschlüsseln können (nicht, dass dies ein großes Problem wäre, aber dennoch „gut zu haben“).

Um eine Nummer zu verschlüsseln, würden Sie Folgendes tun:

require('lib/Hashids/Hashids.php');

$hashids = new Hashids\Hashids('this is my salt');
$hash = $hashids->encrypt(123);

Dein $hash wäre jetzt: YDx

Sie können auch die minimale Hash-Länge als zweiten Parameter für den Konstruktor festlegen, damit Ihre Hashes länger werden können. Oder wenn Sie ein komplexes Cluster-System haben, können Sie sogar mehrere Zahlen in einem Hash verschlüsseln:

$hash = $hashids->encrypt(2, 456); /* aXupK */

(z. B. wenn Sie einen Benutzer im Cluster haben 2 und ein Objekt mit primärer ID 456) Die Entschlüsselung funktioniert genauso:

$numbers = $hashids->decrypt('aXupK');

$numbers wäre dann: [2, 456].

Das Gute daran ist, dass Sie diese Hashes nicht einmal in der Datenbank speichern müssen. Sie könnten den Hash von der URL abrufen, sobald die Anfrage eingeht, und ihn im Handumdrehen entschlüsseln – und dann die primären IDs aus der Datenbank abrufen (was offensichtlich ein Geschwindigkeitsvorteil ist).

Dasselbe gilt für die Ausgabe – Sie könnten die IDs auf dem Weg nach draußen verschlüsseln und dem Benutzer den Hash anzeigen.

BEARBEITEN:

  1. Geänderte URLs, um sowohl die Dokument-Website als auch die Codequelle einzuschließen
  2. Geänderter Beispielcode zur Anpassung an die wichtigsten Lib-Updates (aktuelle PHP-Lib-Version ist 0.3.0 – danke an die gesamte Open-Source-Community für die Verbesserung der Lib)

Auto-Incrementing kann leicht gecrawlt werden. Diese können nicht vorhergesagt und daher nicht sequentiell gecrawlt werden.

Ich schlage vor, ein Doppel-URL-Format zu verwenden (ähnlich den SO-URLs):

yoursite.com/video_idkey/url_friendly_video_title

Wenn Sie sowohl die ID als auch den Titel in der URL benötigen, können Sie einfache Zahlen wie 0001, 0002, 0003 usw. verwenden.

Das Generieren dieser Schlüssel kann sehr einfach sein. Du könntest die verwenden uniqid() Funktion in PHP, um 13 Zeichen oder 23 mit mehr Entropie zu generieren.

  • Das ist aber genau das Richtige … Das URL-Schema von SO erfordert den Titel überhaupt nicht, siehe: stackoverflow.com/questions/1076110

    – Johannes T

    2. Juli 2009 um 19:11 Uhr

  • Wenn Crawling Ihr Problem ist, können Sie es zwingen, beide Teile zu benötigen.

    – mp

    2. Juli 2009 um 19:12 Uhr

  • Ich weiß – du musst es auch nicht verlangen. Aber wenn Sie verhindern möchten, dass sie 1-1.000.000 kriechen, fordern Sie auch den Titel an.

    – Samson

    2. Juli 2009 um 19:55 Uhr

  • Was ist falsch am Krabbeln? Alle Seiten, die Benutzer nicht sehen sollen, sollten sowieso geschützt sein …

    – Kamerun

    23. November 2010 um 23:09 Uhr

Benutzeravatar von mpen
mpen

Wenn Sie kurze URLs wünschen und Vorhersagbarkeit keine Rolle spielt, können Sie das tun Konvertieren Sie die automatisch inkrementierende ID in eine höhere Basis.

  • Das ist aber genau das Richtige … Das URL-Schema von SO erfordert den Titel überhaupt nicht, siehe: stackoverflow.com/questions/1076110

    – Johannes T

    2. Juli 2009 um 19:11 Uhr

  • Wenn Crawling Ihr Problem ist, können Sie es zwingen, beide Teile zu benötigen.

    – mp

    2. Juli 2009 um 19:12 Uhr

  • Ich weiß – du musst es auch nicht verlangen. Aber wenn Sie verhindern möchten, dass sie 1-1.000.000 kriechen, fordern Sie auch den Titel an.

    – Samson

    2. Juli 2009 um 19:55 Uhr

  • Was ist falsch am Krabbeln? Alle Seiten, die Benutzer nicht sehen sollen, sollten sowieso geschützt sein …

    – Kamerun

    23. November 2010 um 23:09 Uhr

Benutzeravatar von Dev Bhaskar
Dev Bhaskar

Hier ist eine kleine Funktion, die jedes Mal zufällig einen eindeutigen Schlüssel generiert. Es hat sehr wenige Chancen, dieselbe eindeutige ID zu wiederholen.

function uniqueKey($limit = 10) {
    $characters="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $randstring = '';
    for ($i = 0; $i < $limit; $i++) {
        $randstring .= $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}

Quelle: Generieren Sie zufällige eindeutige IDs wie YouTube oder TinyURL in PHP

1430500cookie-checkWie erstelle ich eindeutige IDs wie YouTube?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy