Start · Sprachen · PHP · Referenz · uniqid

uniqid

Funktion

Erzeugt eine zeitbasierte, (pseudo-)eindeutige ID als Zeichenkette, optional mit Präfix und erhöhter Entropie.

seit PHP 4.0.0 Kategorie: misc

Signatur

uniqid(string $prefix = "", bool $more_entropy = false): string

Beschreibung

uniqid() generiert eine eindeutige ID auf Basis der aktuellen Mikrosekunden-Zeit (via gettimeofday()). Ohne zusätzliche Entropie besteht die Ausgabe aus 13 Hexadezimalzeichen; mit $more_entropy = true wird ein zufälliger Float-Wert angehängt, was die Ausgabe auf 23 Zeichen verlängert und Kollisionen deutlich unwahrscheinlicher macht.

Ein optionaler $prefix erleichtert es, IDs aus verschiedenen Quellen (z. B. mehrere Server, mehrere Prozesse) auseinanderzuhalten. Die Gesamtlänge der erzeugten ID beträgt dann strlen($prefix) + 13 bzw. strlen($prefix) + 23 Zeichen.

Die Funktion eignet sich gut für temporäre Dateinamen, Cache-Schlüssel oder sonstige Situationen, in denen ein leichtgewichtiger Bezeichner ohne Datenbankzugriff benötigt wird. Für kryptografisch sichere Zufalls-IDs oder UUIDs sollte stattdessen random_bytes() zusammen mit bin2hex() oder die Funktion com_create_guid() (Windows) verwendet werden.

Achtung: uniqid() ist nicht kryptografisch sicher und daher ungeeignet für Passwort-Reset-Token, Session-IDs oder ähnliche sicherheitskritische Bezeichner. Auf stark ausgelasteten Systemen oder bei identischer Systemzeit können theoretisch Kollisionen auftreten – $more_entropy = true reduziert dieses Risiko, eliminiert es aber nicht vollständig.

Parameter

Name Typ Default Beschreibung
$prefix string "" Optionaler Präfix, der der erzeugten ID vorangestellt wird. Nützlich, um IDs verschiedener Server oder Komponenten zu unterscheiden.
$more_entropy bool false Wenn true, wird ein kombinierter LCG-Zufallswert (Combined Linear Congruential Generator) an die ID angehängt. Dadurch wird die Eindeutigkeit erhöht und die Ausgabe verlängert sich auf 23 Zeichen (plus Präfix).

Rückgabewert

Typ
string
Beschreibung
Gibt die erzeugte eindeutige ID als Zeichenkette zurück. Die Länge beträgt 13 Zeichen (ohne Präfix, ohne zusätzliche Entropie) bzw. 23 Zeichen (mit $more_entropy = true), jeweils zuzüglich der Länge des Präfixes.

Beispiele

Einfache Verwendung ohne und mit Präfix

<?php
// Einfache ID ohne Präfix
$id1 = uniqid();
echo $id1 . PHP_EOL; // z. B. 6643a2f1d3c7e

// ID mit Präfix
$id2 = uniqid('user_');
echo $id2 . PHP_EOL; // z. B. user_6643a2f1d3c7e

// ID mit Präfix und erhöhter Entropie
$id3 = uniqid('order_', true);
echo $id3 . PHP_EOL; // z. B. order_6643a2f1d3c7e4.52341267
6643a2f1d3c7e user_6643a2f1d3c7e order_6643a2f1d3c7e4.52341267

Temporären Dateinamen erzeugen

<?php
// Temporäre Upload-Datei mit eindeutigem Namen anlegen
$uploadDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR;
$tempName  = uniqid('upload_', true) . '.tmp';
$tempPath  = $uploadDir . $tempName;

file_put_contents($tempPath, 'Temporäre Daten');
echo 'Temporäre Datei erstellt: ' . $tempPath . PHP_EOL;

// Aufräumen
unlink($tempPath);
Temporäre Datei erstellt: /tmp/upload_6643a2f1d3c7e4.52341267.tmp

Sichere Alternative mit random_bytes für sicherheitskritische IDs

<?php
// NICHT uniqid() für Tokens verwenden – stattdessen:
$secureToken = bin2hex(random_bytes(16));
echo $secureToken . PHP_EOL; // z. B. 3f4a2b1c9d8e7f6a5b4c3d2e1f0a9b8c

// Vergleich: uniqid() ist NICHT kryptografisch sicher
$unsafeId = uniqid('', true);
echo $unsafeId . PHP_EOL;
3f4a2b1c9d8e7f6a5b4c3d2e1f0a9b8c 6643a2f1d3c7e4.52341267

// Wichtig · Fallstricke

Sicherheitswarnung: uniqid() ist nicht kryptografisch sicher. Die Ausgabe ist vorhersagbar, wenn die Systemzeit des Servers bekannt ist. Für Passwort-Reset-Token, CSRF-Token, API-Schlüssel oder Session-IDs muss stattdessen random_bytes() in Kombination mit bin2hex() genutzt werden.

Auf Systemen, auf denen gettimeofday() keine Mikrosekunden-Auflösung liefert (z. B. einige Windows-Konfigurationen), können Kollisionen häufiger auftreten. $more_entropy = true ist daher grundsätzlich empfehlenswert, wenn mehrere IDs in kurzer Folge erzeugt werden.

Die Funktion schlägt nie fehl und gibt immer einen String zurück – es gibt keinen Fehlerzustand und keine Ausnahme.