W3docs

uniqid()

Erklärung der PHP-Funktion uniqid(): Syntax, Parameter, Rückgabewert und wann man sie verwenden sollte – und wann nicht.

Die PHP-Funktion uniqid() erzeugt eine String-ID, die aus der aktuellen Zeit in Mikrosekunden abgeleitet wird. Diese Seite erläutert die Syntax und Parameter, wie der zurückgegebene Wert aussieht, den wichtigen Vorbehalt, dass sie nicht für Sicherheits-Tokens geeignet ist, und was stattdessen verwendet werden sollte.

Was uniqid() tut

uniqid() gibt einen 13-stelligen hexadezimalen String zurück, der auf der aktuellen Systemzeit gemessen bis zur Mikrosekunde basiert. Da die Uhr kontinuierlich weiterläuft, erzeugen zwei Aufrufe, die auch nur einen Bruchteil einer Sekunde auseinanderliegen, meist unterschiedliche Werte. Das macht die Funktion praktisch für risikoarme Bezeichner wie temporäre Dateinamen, Cache-Schlüssel oder DOM-Element-IDs.

Es handelt sich um einen zeitbasierten Bezeichner, nicht um einen zufälligen. Dieser Unterschied ist wichtig: Der Wert ist vorhersehbar, und auf einem schnellen Rechner geben zwei Aufrufe in derselben Mikrosekunde den gleichen String zurück. Beachten Sie dies, bevor Sie sich auf die Eindeutigkeit verlassen – und verwenden Sie ihn niemals für sicherheitsrelevante Zwecke.

Syntax

uniqid(string $prefix = "", bool $more_entropy = false): string
ParameterTypBeschreibung
$prefixstringText, der der zurückgegebenen ID vorangestellt wird. Nützlich, wenn mehrere Hosts oder Prozesse gleichzeitig IDs erzeugen könnten. Standardmäßig ein leerer String.
$more_entropyboolWenn true, werden zusätzliche Zeichen angehängt, die Kollisionen erschweren. Standardmäßig false.

Rückgabewert: ein String. Mit Standardargumenten ist er 13 Zeichen lang; bei auf true gesetztem $more_entropy ist er 23 Zeichen lang (die Präfixlänge wird in beiden Fällen noch addiert).

Grundlegende Verwendung

Rufen Sie uniqid() ohne Argumente auf, um eine einfache zeitstempelbasierte ID zu erhalten:

php— editable, runs on the server

Die zurückgegebene $id besteht aus 13 hexadezimalen Zeichen. Jeder Aufruf gibt einen anderen Wert aus, da der zugrunde liegende Mikrosekunden-Zeitstempel weitergelaufen ist.

Präfix hinzufügen

Übergeben Sie einen String als erstes Argument, um ihn der ID voranzustellen. Das hilft Ihnen, IDs, die in verschiedenen Teilen Ihrer Anwendung oder auf verschiedenen Servern generiert werden, auseinanderzuhalten:

php— editable, runs on the server

Das Präfix ist nicht zufällig – es wird unverändert vorangestellt – und erhöht daher die Eindeutigkeit nicht von sich aus. Seine Aufgabe ist es, die ID zu kennzeichnen.

Mehr Entropie

In einer schnellen Schleife kann sich der Zeitstempel wiederholen und Sie erhalten doppelte IDs. Wenn Sie das zweite Argument auf true setzen, werden zusätzliche Zeichen (basierend auf einem kombinierten linearen Kongruenzgenerator) angehängt, um dieses Risiko zu verringern:

php— editable, runs on the server

Bei aktiviertem $more_entropy ist das Ergebnis 23 Zeichen lang. Dies verringert die Kollisionswahrscheinlichkeit, macht den Wert aber nicht unvorhersehbar.

Wichtig: uniqid() ist nicht sicher

Dies ist der häufigste Fehler bei der Verwendung von uniqid(). Da der Wert aus der Uhr abgeleitet wird, kann ein Angreifer, der ungefähr weiß, wann eine ID erstellt wurde, diese erraten. Verwenden Sie uniqid() niemals für:

  • Passwort-Reset-Tokens oder „Magic Link"-Tokens
  • Session-Bezeichner oder API-Schlüssel
  • CSRF-Tokens oder andere sicherheitsrelevante Werte

Für alles, was unvorhersehbar sein muss, verwenden Sie eine kryptografisch sichere Quelle. random_bytes() (PHP 7+) ist das richtige Werkzeug, das optional mit bin2hex() in einen lesbaren String umgewandelt werden kann:

<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>

Wenn Sie einen global eindeutigen Bezeichner in einem Standardformat benötigen, ist eine UUID (über eine Bibliothek wie ramsey/uuid) in der Regel besser geeignet als uniqid().

Wann sollte man uniqid() verwenden?

uniqid() ist eine gute Wahl, wenn Sie eine schnelle, kurzlebige Bezeichnung benötigen und ein geringes Kollisionsrisiko akzeptabel ist:

  • temporäre Upload- oder Cache-Dateinamen
  • eindeutige HTML-id-Attribute, die serverseitig generiert werden
  • kurzlebige Schlüssel in nicht sicherheitskritischen Caches

Für unvorhersehbare Geheimnisse verwenden Sie random_bytes(); für allgemeine Zufälligkeit siehe mt_rand() und rand(); und wenn Sie nur den zugrunde liegenden hochauflösenden Zeitstempel benötigen, schauen Sie sich microtime() an.

Zusammenfassung

Die Funktion uniqid() erzeugt eine 13-stellige (oder 23-stellige mit $more_entropy) ID aus dem aktuellen Mikrosekunden-Zeitstempel. Sie ist praktisch für nicht sicherheitsrelevante, kollisionsarme Bezeichner, aber von Natur aus vorhersehbar – für Sicherheits-Tokens sollten Sie stets random_bytes() bevorzugen. Die Wahl des richtigen Werkzeugs für die Aufgabe stellt sicher, dass Ihre IDs sowohl eindeutig genug als auch, wo es darauf ankommt, nicht erratbar sind.

Übungen

Übung
Was ist die Funktion von uniqid() in PHP?
Was ist die Funktion von uniqid() in PHP?
Was this page helpful?