Signatur
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
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";
}
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";
}
// 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().