Compression delta binaire : UXC v3 vs xdelta3 vs bsdiff4

DéploiementComparatif
← Tous les articles

Qu'est-ce qu'un patch delta binaire ?

Un patch delta binaire encode uniquement la différence entre deux versions d'un fichier binaire. Mettre à jour une application de 80 MB qui n'a changé qu'à 5% ne devrait pas nécessiter de retélécharger 80 MB. Un bon algorithme delta réduit cette mise à jour à 3–5 MB.

Trois algorithmes dominent en 2026 : bsdiff4 (référence académique), xdelta3 (standard de l'industrie du jeu vidéo) et UXC v3 (format propriétaire de Universal Installer avec delta intégré).

Le choix d'un algorithme delta n'est pas qu'une question de ratio : la mémoire requise, la tolérance aux corruptions partielles et la vitesse d'application sur la machine cliente sont souvent plus critiques.

bsdiff / bsdiff4

bsdiff est l'algorithme de référence académique créé par Colin Percival. Il utilise un suffix array pour comparer les deux fichiers et produit des patches très compacts, particulièrement efficaces sur les fichiers compilés (EXE, DLL, SO).

import bsdiff4

# Générer le patch
patch = bsdiff4.diff(open('app_v1.exe', 'rb').read(),
                     open('app_v2.exe', 'rb').read())
open('patch_v1_v2.bsdiff', 'wb').write(patch)

# Appliquer le patch
v2 = bsdiff4.patch(open('app_v1.exe', 'rb').read(), patch)
open('app_v2.exe', 'wb').write(v2)

xdelta3

xdelta3 est l'algorithme utilisé par l'industrie du jeu vidéo (Steam, GOG) et de nombreux gestionnaires de paquets Linux. Il utilise un algorithme de fenêtre glissante (VCDIFF standard RFC 3284) qui consomme beaucoup moins de mémoire que bsdiff.

UXC v3 — format .uxcd

UXC v3 introduit le format .uxcd (UXC Delta). Il combine bsdiff4 pour les blocs modifiés avec une optimisation clé : les blocs identiques entre deux versions sont référencés sans être re-encodés (taille 0 dans le patch).

# Format .uxcd — structure
[8B]  magic    : 55 58 43 44 00 03 00 00  ("UXCD" v3)
[4B]  n_blocks : nombre de blocs (64 KB chacun)
[N×] block_entries :
  [4B] block_id   : index du bloc dans le fichier cible
  [1B] block_type : IDENTICAL(0) | BSDIFF(1) | FULL(2)
  [4B] patch_size : taille du patch pour ce bloc
  [?B] patch_data : vide si IDENTICAL, bsdiff sinon
[32B] hmac_sha256 : intégrité du patch complet

Le bloc IDENTICAL permet d'ignorer complètement les parties inchangées — pour un EXE Python où seules les ressources ont changé, 80% des blocs sont IDENTICAL et occupent 0 byte dans le patch.

Comparatif sur un EXE Python 80 MB (5% modifié)

Critère UXC v3 (.uxcd) bsdiff4 xdelta3
Taille du patch~3.2 MB~2.8 MB~4.1 MB
Mémoire génération~200 MB~720 MB~80 MB
Temps génération~18s~22s~8s
Temps application~2s~4s~1.5s
Résumption partielle✓ par bloc✗Partielle
Vérification intégritéHMAC-SHA256CRC32Adler32
Multi-fichiers natif✓✗✗
Pure Python✓✓✗ (binaire C)

Implémentation Python avec Universal Installer

from universal_installer.delta import UXCDelta

delta = UXCDelta()

# Générer un patch .uxcd
stats = delta.create_patch(
    source="app_v1.0.uxc",
    target="app_v1.1.uxc",
    output="patch_v1.0_to_v1.1.uxcd",
    block_size=65536  # 64 KB par bloc
)
print(stats)
# {'identical_blocks': 1024, 'patched_blocks': 51,
#  'full_blocks': 5, 'patch_size_mb': 3.2, 'ratio': 0.04}

# Appliquer le patch
delta.apply_patch(
    source="app_v1.0.uxc",
    patch="patch_v1.0_to_v1.1.uxcd",
    output="app_v1.1.uxc",
    verify_hmac=True
)

Cas d'usage pratiques

Conclusion

UXC v3 est le meilleur choix pour les mises à jour de packages Python et d'archives multi-fichiers. bsdiff4 reste supérieur sur le ratio brut pour les fichiers uniques. xdelta3 domine en mémoire et en vitesse de génération. Universal Installer V2 implémente UXC v3 nativement avec génération automatique de patches lors des uploads cloud.

📦
PRODUIT LIÉ
Universal Installer V2.0
Découvrir V2 → Manuel complet
← Guide V2 Article suivant →