Position actuelle: Accueil> Derniers articles> Utilisez hash_update_stream () pour implémenter la fonction de déduplication de fichier

Utilisez hash_update_stream () pour implémenter la fonction de déduplication de fichier

M66 2025-05-18

La déduplication des fichiers est une partie très importante du traitement des données, en particulier lorsqu'un grand nombre de fichiers doivent être traités, la suppression des fichiers en double peut économiser l'espace de stockage et améliorer l'efficacité du système. PHP fournit une fonction très puissante hash_update_stream () , qui peut nous aider à effectuer des calculs de hachage plus efficacement pendant la déduplication de fichier. Cet article introduira en détail comment utiliser la fonction hash_update_stream () pour atteindre une fonction de déduplication de fichiers efficace.

1. Quelle est la fonction hash_update_stream () ?

hash_update_stream () est l'une des fonctions de hachage intégrées dans PHP. Il peut traiter les fichiers volumineux sans charger les fichiers en mémoire à la fois en lisant progressivement le contenu des fichiers et en calculant la valeur de hachage. Il convient aux calculs de hachage des grands fichiers de données et peut mettre à jour les valeurs de hachage en temps réel.

Sa signature de fonction est la suivante:

 bool hash_update_stream ( resource $context , resource $file , int $length = 8192 )
  • $ Context : le contexte de hachage créé par hash_init () .

  • $ Fichier : la ressource de fichier pour calculer la valeur de hachage.

  • $ Longueur : le nombre d'octets par fichier lecture, la valeur par défaut est de 8192 octets.

2. Utilisez hash_update_stream () pour réaliser la déduplication des fichiers

Dans le cas de la déduplication de fichier, nous devons généralement calculer une valeur de hachage pour chaque fichier, puis déterminer si la valeur de hachage existe déjà. Si la valeur de hachage existe déjà, cela signifie que le fichier est dupliqué et que nous pouvons le supprimer.

Via hash_update_stream () , nous pouvons effectuer efficacement les calculs de hachage étape par étape sur les fichiers volumineux sans consommer trop de mémoire, améliorant ainsi l'efficacité de la déduplication.

3. Étapes de mise en œuvre

Voici un exemple php simple de déduplication de fichiers, en utilisant hash_update_stream () pour traiter les calculs de hachage des fichiers:

 <?php

// Configuration de l&#39;algorithme de hachage
$hash_algorithm = 'sha256';

// Obtenez le dossier du chemin vers Deduplicate
$directory = '/path/to/your/files';

// Créer un tableau qui stocke les valeurs de hachage
$hashes = [];

// Obtenez tous les fichiers dans le répertoire
$files = scandir($directory);

foreach ($files as $file) {
    $file_path = $directory . DIRECTORY_SEPARATOR . $file;

    // franchir '.' et '..'
    if ($file === '.' || $file === '..') {
        continue;
    }

    // Initialiser le contexte du hachage
    $context = hash_init($hash_algorithm);

    // Ouvrir le fichier
    $file_resource = fopen($file_path, 'rb');
    if ($file_resource) {
        // Mettre à jour progressivement la valeur de hachage
        while (!feof($file_resource)) {
            hash_update_stream($context, $file_resource, 8192);
        }

        // Fermer les ressources de fichiers
        fclose($file_resource);

        // Obtenez la valeur de hachage finale du fichier
        $hash = hash_final($context);

        // Vérifiez si la valeur de hachage existe déjà
        if (in_array($hash, $hashes)) {
            // Si le fichier est répété,Supprimer
            unlink($file_path);
            echo "Supprimer les fichiers en double: $file\n";
        } else {
            // sinon,Ajouter de la valeur de hachage à un tableau de hachage existant
            $hashes[] = $hash;
        }
    } else {
        echo "无法Ouvrir le fichier: $file\n";
    }
}

echo "La déduplication des fichiers est terminée!\n";

?>

4. Analyse de code

  1. Obtenez tous les fichiers dans le dossier : Tout d'abord, nous utilisons la fonction scandir () pour obtenir tous les fichiers dans le répertoire. Notez que nous voulons sauter le. et .. dossiers.

  2. Calculez la valeur de hachage étape par étape : pour chaque fichier, le contexte de hachage est initialisé d'abord, puis le fichier est lu étape par étape et met à jour la valeur de hachage à l'aide de hash_update_stream () .

  3. Jugement de déduplication : En stockant le tableau de valeur de hachage calculé $ hachages , nous déterminons si la valeur de hachage du fichier actuel existe déjà. S'il existe, cela signifie que le fichier est répété et que le fichier est supprimé directement; Sinon, ajoutez la valeur de hachage au tableau et continuez à traiter le fichier suivant.

5. Optimisation et précautions

  • Optimisation de la mémoire : avec la fonction hash_update_stream () , nous évitons de charger le fichier entier en mémoire, afin que nous puissions gérer les fichiers volumineux.

  • Deduplication simultanée : pour un grand nombre de fichiers, un traitement multi-threading ou par lots peut être utilisé pour augmenter davantage la vitesse de déduplication. PHP native ne prend pas en charge le multithreading, mais peut être réalisé en utilisant des extensions telles que des pthreads ou en distribuant des tâches à plusieurs processus.

  • Collision de hachage : Bien que la possibilité d'une collision de hachage soit extrêmement faible, dans les cas extrêmes, si les valeurs de hachage des deux fichiers sont les mêmes mais que le contenu est différent, il sera toujours mal jugé en tant que fichiers en double. Par conséquent, le choix d'un algorithme de hachage qui est suffisamment fort (comme SHA256 ) peut réduire considérablement ce risque.

6. Conclusion

En utilisant la fonction hash_update_stream () , nous pouvons implémenter très efficacement les opérations de déduplication de fichiers, en particulier lors du traitement des fichiers volumineux, ce qui peut réduire considérablement la consommation de mémoire et améliorer l'efficacité. Grâce à un jugement de valeur de hachage simple, nous pouvons facilement supprimer des fichiers en double, enregistrer l'espace de stockage et améliorer les performances du système.

J'espère que cet article peut vous aider à mieux comprendre et utiliser hash_update_stream () pour implémenter la fonction de déduplication de fichier! Si vous avez des questions, veuillez laisser un message dans la zone de commentaires.