Start · Sprachen · PHP · Referenz · Random\Randomizer

Random\Randomizer

Klasse

Bietet eine objektorientierte High-Level-API für Zufallswerte, die von einer austauschbaren <code>Random\Engine</code>-Implementierung geliefert werden.

seit PHP 8.2.0 Kategorie: crypto

Signatur

class Random\Randomizer

Beschreibung

Random\Randomizer ist die zentrale Klasse des in PHP 8.2 eingeführten Random-Namensraums. Sie kapselt den Zugriff auf eine Random\Engine und stellt darüber bequeme Methoden bereit, um Zufallszahlen, Bytes, Arrayelemente oder gemischte Sequenzen zu erzeugen – ohne selbst Details der Entropie-Erzeugung kennen zu müssen.

Die Engine wird im Konstruktor übergeben. Wird keine Engine angegeben, verwendet Randomizer standardmäßig Random\Engine\Secure, die kryptografisch sichere Zufallswerte (CSPRNG) liefert. Für reproduzierbare Tests eignet sich hingegen Random\Engine\Mt19937 mit festem Seed. Dadurch lassen sich Zufalls-abhängige Algorithmen einfach testen und verifizieren, indem lediglich die Engine ausgetauscht wird.

Im Vergleich zu älteren Funktionen wie rand(), mt_rand() oder shuffle() bietet Randomizer eine klar getrennte, testbare und wiederverwendbare Abstraktionsschicht. Alle Methoden sind thread-sicher, da der interne Zustand in der Engine-Instanz gekapselt ist.

  • Kryptografisch sicher (Standard): new Randomizer() oder new Randomizer(new Random\Engine\Secure())
  • Reproduzierbar/testbar: new Randomizer(new Random\Engine\Mt19937(42))
  • Benutzerdefiniert: Eigene Engine-Implementierung möglich über das Interface Random\Engine

Parameter

Name Typ Default Beschreibung
$engine Random\Engine new Random\Engine\Secure() Die zu verwendende Zufallsengine. Wird nichts übergeben, verwendet Randomizer Random\Engine\Secure für kryptografisch sichere Werte. Für Tests kann z. B. Random\Engine\Mt19937 mit festem Seed genutzt werden.

Rückgabewert

Typ

Beispiele

Kryptografisch sichere Zufallswerte (Standard)

<?php
use Random\Randomizer;

$rng = new Randomizer();

// Zufällige ganze Zahl zwischen 1 und 100
$zahl = $rng->getInt(1, 100);
echo "Zufallszahl: $zahl\n";

// 16 zufällige Bytes als Hex-String
$bytes = $rng->getBytes(16);
echo "Zufalls-Bytes (hex): " . bin2hex($bytes) . "\n";

// Zufälliges Element aus einem Array
$farben = ['rot', 'grün', 'blau', 'gelb'];
$picked = $rng->pickArrayKeys($farben, 2);
echo "Gezogene Schlüssel: " . implode(', ', $picked) . "\n";

// Array mischen (ohne Original zu verändern)
$gemischt = $rng->shuffleArray($farben);
echo "Gemischt: " . implode(', ', $gemischt) . "\n";
Zufallszahl: 57 Zufalls-Bytes (hex): a3f1c8e204b7d96f1e3a0c2b58d4f701 Gezogene Schlüssel: 1, 3 Gemischt: blau, rot, gelb, grün

Reproduzierbare Zufallswerte für Unit-Tests

<?php
use Random\Randomizer;
use Random\Engine\Mt19937;

// Fester Seed → immer gleiche Sequenz
$rng = new Randomizer(new Mt19937(42));

echo $rng->getInt(1, 100) . "\n"; // immer gleicher Wert
echo $rng->getInt(1, 100) . "\n";

$woerter = ['Apfel', 'Birne', 'Kirsche', 'Pflaume', 'Mango'];
$gemischt = $rng->shuffleArray($woerter);
echo implode(', ', $gemischt) . "\n";
// Immer die gleiche Reihenfolge bei gleichem Seed
15 91 Kirsche, Apfel, Mango, Birne, Pflaume

Zufälligen String aus Zeichenvorrat erzeugen

<?php
use Random\Randomizer;

$rng = new Randomizer();

// Zufälligen alphanumerischen Token erzeugen
$zeichen = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$token = $rng->getBytesFromString($zeichen, 32);
echo "Token: $token\n";

// Zufälligen Würfelwurf-String (D6, 10 Würfe)
$wuerfel = '123456';
$wurf = $rng->getBytesFromString($wuerfel, 10);
echo "Würfelwürfe: $wurf\n";
Token: k7RmX2pQvNzA0cJdTsL9Uw4BYeHfGiMo Würfelwürfe: 3154623461

// Wichtig · Fallstricke

Sicherheitshinweis: Für sicherheitskritische Anwendungen (Tokens, Passwörter, CSRF-Schutz) grundsätzlich die Standard-Engine Random\Engine\Secure verwenden. Mt19937 ist nicht kryptografisch sicher und darf für solche Zwecke nicht eingesetzt werden.

Serialisierbarkeit: Randomizer-Instanzen sind serialisierbar – der interne Engine-Zustand wird mit serialisiert. Das kann nützlich sein, um den Zustand eines Zufallsgenerators zu speichern und fortzusetzen, birgt jedoch Risiken, wenn der Zustand einer unsicheren Engine (z. B. Mt19937) offengelegt wird.

Verfügbare Methoden im Überblick:

  • getInt(int $min, int $max): int – Zufallszahl im Bereich
  • getBytes(int $length): string – Zufällige Rohbytes
  • getBytesFromString(string $string, int $length): string – Zufällige Zeichen aus Zeichenvorrat (seit PHP 8.3)
  • shuffleArray(array $array): array – Array mischen, Original bleibt unverändert
  • shuffleBytes(string $bytes): string – Bytes-String mischen
  • pickArrayKeys(array $array, int $num): array – Zufällige Schlüssel wählen
  • nextFloat(): float – Float im Bereich [0.0, 1.0) (seit PHP 8.3)
  • getFloat(float $min, float $max): float – Float in gegebenem Bereich (seit PHP 8.3)