Start · Sprachen · PHP · Referenz · Random\Engine

Random\Engine

Interface

Definiert eine Low-Level-Schnittstelle für Zufallszahlen-Engines, die rohe Zufallsbytes liefern und von High-Level-APIs wie <code>Random\Randomizer</code> genutzt werden.

seit PHP 8.2.0 Kategorie: crypto

Signatur

interface Random\Engine

Beschreibung

Das Interface Random\Engine ist die Basis-Schnittstelle des in PHP 8.2 eingeführten Zufallszahlensystems. Es schreibt genau eine Methode vor – generate() –, die einen String roher Zufallsbytes zurückgibt. Alle eingebauten Engines wie Random\Engine\Mt19937, Random\Engine\PcgOneseq128XslRr64, Random\Engine\Xoshiro256StarStar und Random\Engine\Secure implementieren dieses Interface.

Der Hauptzweck von Random\Engine ist die Entkopplung der Byte-Erzeugung von der höheren Abstraktionsebene. Die Klasse Random\Randomizer nimmt ein Random\Engine-Objekt entgegen und baut darauf alle komfortablen Zufallsmethoden (z. B. getInt(), shuffleArray()) auf. Dadurch können unterschiedliche Engines – reproduzierbare für Tests oder kryptografisch sichere für Produktion – ohne Codeänderung ausgetauscht werden.

Eigene Implementierungen sind möglich: Wer eine eigene deterministische oder externe Zufallsquelle einbinden möchte, implementiert Random\Engine und überschreibt generate(). Dabei muss die Methode stets einen nicht-leeren String zurückgeben, dessen Länge eine Potenz von 2 (1, 2, 4, 8 Bytes) ist, damit Random\Randomizer korrekt arbeitet.

Für kryptografisch sichere Zufallszahlen in Produktivsystemen sollte ausschließlich Random\Engine\Secure verwendet werden, da sie intern auf CSPRNG-Quellen des Betriebssystems zurückgreift.

Beispiele

Eigene Engine implementieren und mit Randomizer nutzen

<?php

use Random\Engine;
use Random\Randomizer;

// Eigene, reproduzierbare (nicht produktionsgeeignete) Engine
class ConstantEngine implements Engine
{
    public function generate(): string
    {
        // Gibt immer denselben 4-Byte-Wert zurück – nur zu Demo-Zwecken!
        return "\x01\x02\x03\x04";
    }
}

$randomizer = new Randomizer(new ConstantEngine());

// Liefert deterministisch immer denselben Wert
echo $randomizer->getInt(0, 100) . PHP_EOL;

// Eingebaute kryptografisch sichere Engine
$secureRandomizer = new Randomizer(new Random\Engine\Secure());
echo $secureRandomizer->getInt(0, 100) . PHP_EOL;
1 (zufällige Ganzzahl zwischen 0 und 100)

Engine-Austausch für reproduzierbare Unit-Tests

<?php

use Random\Engine\Mt19937;
use Random\Randomizer;

// Seeded Engine für reproduzierbare Testergebnisse
$engine = new Mt19937(42);
$randomizer = new Randomizer($engine);

$shuffled = $randomizer->shuffleArray([1, 2, 3, 4, 5]);
echo implode(', ', $shuffled) . PHP_EOL;

// Mit demselben Seed ergibt sich immer dieselbe Reihenfolge
$engine2 = new Mt19937(42);
$randomizer2 = new Randomizer($engine2);
$shuffled2 = $randomizer2->shuffleArray([1, 2, 3, 4, 5]);
echo implode(', ', $shuffled2) . PHP_EOL;
2, 5, 4, 1, 3 2, 5, 4, 1, 3

// Wichtig · Fallstricke

Sicherheitshinweis: Eigene Implementierungen von Random\Engine sollten niemals in sicherheitskritischen Kontexten (z. B. Token-Generierung, Passwörter, kryptografische Schlüssel) eingesetzt werden, sofern sie nicht nachweislich auf einem CSPRNG basieren. Für solche Anwendungsfälle ist Random\Engine\Secure die einzig vertretbare Wahl.

Rückgabe-Anforderung: Die Methode generate() muss einen nicht-leeren String zurückgeben. Die Länge sollte eine Potenz von 2 (1, 2, 4 oder 8 Bytes) sein. Werden andere Längen zurückgegeben, kann Random\Randomizer eine Random\BrokenRandomEngineError werfen.

Das Interface existiert seit PHP 8.2 und ersetzt die vorherigen globalen Zufallsfunktionen nicht direkt, bietet aber eine saubere objektorientierte Alternative.