Start · Sprachen · PHP · Referenz · Random\Engine\PcgOneseq128XslRr64

Random\Engine\PcgOneseq128XslRr64

Klasse

Implementiert einen Permuted Congruential Generator (PCG) mit 128 Bit internem Zustand und 64 Bit Ausgabe für hochwertige Pseudozufallszahlen.

seit PHP 8.2.0 Kategorie: crypto

Signatur

class Random\Engine\PcgOneseq128XslRr64 implements Random\Engine

Beschreibung

Random\Engine\PcgOneseq128XslRr64 ist eine konkrete Implementierung des Random\Engine-Interfaces und basiert auf dem PCG-Algorithmus (Permuted Congruential Generator) in der Variante oneseq-128-xsl-rr-64. Der Generator verwendet einen 128 Bit breiten internen Zustand und liefert bei jedem Aufruf von generate() 8 Byte (64 Bit) Pseudozufallsdaten.

PCG-Generatoren zeichnen sich durch exzellente statistische Eigenschaften, hohe Geschwindigkeit und eine kompakte Implementierung aus. Sie eignen sich hervorragend für Simulationen, Spiele, Unit-Tests mit reproduzierbaren Zufallsfolgen und alle Anwendungsfälle, bei denen kryptographische Sicherheit nicht erforderlich, aber eine hohe Qualität der Zufallszahlen gewünscht ist. Für kryptographische Zwecke sollte stattdessen Random\Engine\Secure verwendet werden.

Der Generator kann mit einem optionalen Seed initialisiert werden. Ein string-Seed von 16 Byte setzt den vollen 128-Bit-Zustand direkt. Ein int-Seed wird intern auf 128 Bit erweitert. Wird kein Seed übergeben, verwendet PHP einen kryptographisch sicheren Zufallswert als initialen Zustand, was die Reproduzierbarkeit verhindert.

Die Klasse wird typischerweise nicht direkt verwendet, sondern als Engine-Parameter an Random\Randomizer übergeben, der dann komfortable Methoden wie nextInt(), shuffleArray() oder getFloat() bereitstellt.

Parameter

Name Typ Default Beschreibung
$seed string|int|null null Optionaler Seed zur Initialisierung des Generators. Ein int wird auf 128 Bit erweitert; ein string muss exakt 16 Byte lang sein, um den vollen Zustand zu setzen. Bei null wird ein kryptographisch sicherer Zufallsseed verwendet, sodass die Sequenz nicht reproduzierbar ist.

Beispiele

Reproduzierbare Zufallsfolge mit festem Seed

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

$engine = new PcgOneseq128XslRr64(seed: 42);
$randomizer = new Randomizer($engine);

// Erzeugt bei gleichem Seed immer dieselbe Ausgabe
echo $randomizer->nextInt() . PHP_EOL;
echo $randomizer->nextInt() . PHP_EOL;

// Array-Shuffle ist ebenfalls reproduzierbar
$karten = ['Ass', 'König', 'Dame', 'Bube', 'Zehn'];
$gemischt = $randomizer->shuffleArray($karten);
print_r($gemischt);

Zufälligen Float-Wert und Zufalls-String erzeugen

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

// Ohne Seed: nicht reproduzierbar, aber statistisch hochwertig
$engine = new PcgOneseq128XslRr64();
$randomizer = new Randomizer($engine);

// Gleichmäßig verteilter Float zwischen 0.0 und 1.0
$float = $randomizer->nextFloat();
echo 'Float: ' . $float . PHP_EOL;

// 16 zufällige Bytes als Hex-String (für nicht-kryptographische IDs)
$bytes = $randomizer->getBytes(16);
echo 'Hex:   ' . bin2hex($bytes) . PHP_EOL;

Direkter Zugriff auf generate() für rohe Bytes

<?php
use Random\Engine\PcgOneseq128XslRr64;

$engine = new PcgOneseq128XslRr64(seed: 0xDEADBEEF);

// generate() gibt immer 8 Byte (64 Bit) zurück
$rawBytes = $engine->generate();
echo 'Rohe Bytes (hex): ' . bin2hex($rawBytes) . PHP_EOL;
echo 'Länge: ' . strlen($rawBytes) . ' Byte' . PHP_EOL;
Rohe Bytes (hex): <reproduzierbarer 16-stelliger Hex-String> Länge: 8 Byte

// Wichtig · Fallstricke

Keine kryptographische Sicherheit: PCG-Generatoren sind nicht kryptographisch sicher. Den internen Zustand kann man aus einer ausreichenden Anzahl von Ausgabewerten rekonstruieren. Für Passwörter, Tokens oder Schlüssel muss Random\Engine\Secure verwendet werden.

String-Seed-Länge: Wird ein string als Seed übergeben, der nicht exakt 16 Byte lang ist, wirft PHP eine ValueError-Exception. Kürzere oder längere Strings müssen vorher auf exakt 16 Byte gebracht werden (z. B. mit str_pad() oder einem Hash).

Serialisierbarkeit: PcgOneseq128XslRr64-Objekte können mit serialize() und unserialize() vollständig gespeichert und wiederhergestellt werden, was besonders nützlich ist, wenn eine Zufallssequenz über mehrere Requests hinweg fortgesetzt werden soll.