Position actuelle: Accueil> Derniers articles> Comment hachée progressivement un fichier à l'aide de hash_update_stream ()

Comment hachée progressivement un fichier à l'aide de hash_update_stream ()

M66 2025-05-31

Lors du traitement des fichiers volumineux, la lecture directe de l'ensemble du fichier pour les calculs de hachage prendra beaucoup de mémoire et peut même conduire à une mémoire insuffisante. Pour traiter efficacement les fichiers volumineux, PHP fournit la fonction hash_update_stream () , qui nous permet de hacher progressivement les fichiers volumineux. De cette façon, nous pouvons calculer la valeur de hachage lors de la lecture du fichier, évitant ainsi de charger le fichier entier en mémoire à la fois.

Quelle est la fonction hash_update_stream () ?

hash_update_stream () est une fonction de PHP qui met à jour progressivement la valeur de hachage des données de flux. Il est similaire à hash_update () , mais la différence est qu'il accepte une ressource de flux en entrée au lieu de traiter directement les données de chaîne. De cette façon, vous pouvez traiter de grandes quantités de données sans les charger en mémoire à la fois.

Comment utiliser la fonction hash_update_stream () ?

Lorsque vous utilisez la fonction hash_update_stream () , vous devez d'abord ouvrir un flux de fichiers et créer un contexte de hachage pour le fichier. Vous pouvez ensuite diffuser une partie du contenu du fichier et mettre à jour progressivement la valeur de hachage.

Voici les étapes de base des fichiers grands de hachage incrémentiel à l'aide de hash_update_stream () :

  1. Initialiser le contexte du hachage:

    Tout d'abord, utilisez la fonction hash_init () pour initialiser le contexte de hachage. Vous pouvez choisir un algorithme de hachage pris en charge tel que Sha256 ou MD5 .

     $hash_algorithm = 'sha256';  // Sélectionnez un algorithme de hachage
    $context = hash_init($hash_algorithm);
    
  2. Ouvrez le flux de fichiers:

    Utilisez la fonction fopen () pour ouvrir le fichier et obtenir un flux de fichiers.

     $file_path = 'path_to_large_file.txt';  // Remplacer par un chemin de fichier grand
    $file_stream = fopen($file_path, 'rb');
    if (!$file_stream) {
        die("Impossible d'ouvrir le fichier!");
    }
    
  3. Mettre à jour progressivement le hachage:

    Utilisez la fonction hash_update_stream () pour traiter les données du flux de fichiers. Vous pouvez lire le contenu du fichier en lots et mettre à jour la valeur de hachage.

     while (!feof($file_stream)) {
        $data = fread($file_stream, 8192);  // Chaque lecture8KBdonnées
        hash_update_stream($context, $data);
    }
    
  4. Obtenez la valeur de hachage finale:

    Après avoir lu le fichier, utilisez la fonction hash_final () pour obtenir la valeur de hachage finale.

     $final_hash = hash_final($context);
    echo "La valeur de hachage du fichier est: " . $final_hash . PHP_EOL;
    
  5. Fermez le flux de fichiers:

    Enfin, n'oubliez pas de fermer le flux de fichiers.

     fclose($file_stream);
    

Exemple de code complet

 <?php

// Sélectionnez un algorithme de hachage
$hash_algorithm = 'sha256';
$context = hash_init($hash_algorithm);

// Ouvrez le flux de fichiers
$file_path = 'path_to_large_file.txt';  // Remplacer par un chemin de fichier grand
$file_stream = fopen($file_path, 'rb');
if (!$file_stream) {
    die("Impossible d&#39;ouvrir le fichier!");
}

// Valeur de hachage à mise à jour incrémentielle
while (!feof($file_stream)) {
    $data = fread($file_stream, 8192);  // Chaque lecture8KBdonnées
    hash_update_stream($context, $data);
}

// Obtenez la valeur de hachage finale
$final_hash = hash_final($context);
echo "La valeur de hachage du fichier est: " . $final_hash . PHP_EOL;

// Fermez le flux de fichiers
fclose($file_stream);

?>

Choses à noter

  1. Efficacité de la mémoire: lorsque vous utilisez la fonction hash_update_stream () pour traiter les fichiers volumineux, vous pouvez enregistrer beaucoup de mémoire car il ne charge pas le fichier entier en mémoire, mais lit le fichier par bloc et met progressivement à jour la valeur de hachage.

  2. La taille du bloc de lecture du fichier: la taille du bloc de lecture (le deuxième paramètre de Fread () ) peut être ajusté en fonction de la situation réelle. De manière générale, 8 Ko à 64 Ko est une plage raisonnable qui peut être optimisée en fonction de la taille des fichiers et des conditions matérielles.

  3. Gestion des erreurs: Dans les applications réelles, vous devez prêter attention à la gestion des erreurs de lecture de fichiers, telles que le fait d'ouvrir ou de lire les interruptions.

Résumer

La fonction hash_update_stream () est un outil très pratique pour gérer les calculs de hachage pour les fichiers volumineux. Il peut nous aider à calculer les valeurs de hachage étape par étape dans le streaming, en évitant le problème de charger le fichier entier en mémoire en même temps. Avec une taille de bloc raisonnable et des mises à jour incrémentielles, vous pouvez calculer efficacement le hachage des fichiers volumineux, en vous adaptant à divers environnements limitées par la mémoire.