Start · Sprachen · PHP · Referenz · xdiff_string_rabdiff

xdiff_string_rabdiff

Funktion

Erstellt einen binären Diff zweier Strings mithilfe des Rabin-Fingerprinting-Algorithmus und gibt das Ergebnis als String zurück.

seit PHP 1.5.0 Kategorie: misc

Signatur

xdiff_string_rabdiff(string $old_data, string $new_data): string|false

Beschreibung

xdiff_string_rabdiff() berechnet die Unterschiede zwischen zwei Strings auf Binärebene und nutzt dabei den Rabin-Fingerprinting-Algorithmus. Das Ergebnis ist ein kompaktes, binäres Diff-Format, das sich besonders für beliebige Binärdaten eignet – im Gegensatz zu textbasierten Diff-Methoden.

Der Rabin-Fingerprinting-Algorithmus teilt die Eingabedaten in variabler Blockgröße auf, was ihn robuster gegenüber Einfügungen und Löschungen macht als der klassische, blockbasierte xdiff_string_bdiff(). Dadurch wird häufig ein kompakteres Diff-Ergebnis erzielt, besonders wenn die Daten sich durch viele kleine Änderungen unterscheiden.

Das erzeugte Diff-Ergebnis kann anschließend mit xdiff_string_bpatch() auf den alten String angewendet werden, um den neuen String zu rekonstruieren. Dies ist nützlich für Versionierung, Delta-Übertragungen oder effiziente Synchronisation von Binärdaten.

Diese Funktion setzt die PECL-Erweiterung xdiff voraus, die standardmäßig nicht in PHP enthalten ist und separat installiert werden muss.

Parameter

Name Typ Default Beschreibung
$old_data Pflicht string Der ursprüngliche (alte) Binär- oder Text-String, der als Ausgangsbasis für den Diff dient.
$new_data Pflicht string Der neue (geänderte) Binär- oder Text-String, mit dem old_data verglichen wird.

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg einen String zurück, der das binäre Diff im Rabin-Format enthält. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfachen Rabin-Diff zweier Strings erstellen

<?php
$old = "Dies ist der ursprüngliche Inhalt der Datei.";
$new = "Dies ist der geänderte Inhalt der Datei, Version 2.";

$diff = xdiff_string_rabdiff($old, $new);

if ($diff !== false) {
    echo "Diff wurde erfolgreich erstellt. Länge: " . strlen($diff) . " Bytes\n";
} else {
    echo "Fehler beim Erstellen des Diffs.\n";
}
Diff wurde erfolgreich erstellt. Länge: 54 Bytes

Rabin-Diff erstellen und mit bpatch rekonstruieren

<?php
$old = "Version 1: Hallo Welt! Dies ist ein Testinhalt für xdiff.";
$new = "Version 2: Hallo PHP!  Dies ist ein Testinhalt für xdiff, erweitert.";

// Diff erstellen
$diff = xdiff_string_rabdiff($old, $new);

if ($diff === false) {
    die("Fehler beim Erstellen des Diffs.");
}

// Diff auf den alten String anwenden, um neuen String zu rekonstruieren
$reconstructed = xdiff_string_bpatch($old, $diff);

if ($reconstructed === $new) {
    echo "Rekonstruktion erfolgreich! Der neue String stimmt exakt überein.\n";
} else {
    echo "Fehler bei der Rekonstruktion.\n";
}
Rekonstruktion erfolgreich! Der neue String stimmt exakt überein.

// Wichtig · Fallstricke

Voraussetzung: Die PECL-Erweiterung xdiff muss installiert und in der php.ini aktiviert sein (extension=xdiff). Sie ist nicht Teil der PHP-Standardinstallation.

Unterschied zu xdiff_string_bdiff(): Während bdiff einen festen Blockvergleich verwendet, nutzt rabdiff den Rabin-Fingerprinting-Algorithmus mit variabler Blockgröße. Dies führt bei vielen kleinen Änderungen (Einfügungen, Löschungen) zu einem kompakteren Diff. Bei großen, zusammenhängenden Änderungen kann bdiff effizienter sein.

Binäres Format: Das Ergebnis ist kein menschenlesbares Textformat. Es sollte nicht direkt als Text ausgegeben, sondern als Binärdaten gespeichert oder übertragen werden. Zum Rekonstruieren des neuen Strings muss xdiff_string_bpatch() verwendet werden – nicht xdiff_string_patch().