Position actuelle: Accueil> Derniers articles> Comparaison des performances de l'utilisation de hash_update_stream () au lieu de hash_file ()

Comparaison des performances de l'utilisation de hash_update_stream () au lieu de hash_file ()

M66 2025-06-05

Dans PHP, le calcul du hachage de fichiers est généralement utilisé dans des scénarios tels que la vérification de l'intégrité des données, la déduplication des fichiers, les signatures numériques, etc. Lors du traitement des fichiers volumineux, hash_file () et hash_update_stream () sont des méthodes de calcul de hachage courantes. Bien que les deux aient des fonctions similaires, il existe quelques différences de performance. Cet article comparera les différences de performances entre ces deux méthodes lors du traitement des fichiers volumineux, aidant les développeurs à mieux choisir les bonnes fonctions pour améliorer l'efficacité de leurs applications.

1. Introduction à hash_file ()

La fonction hash_file () est utilisée pour calculer directement la valeur de hachage du fichier spécifié. La syntaxe est la suivante:

 string hash_file ( string $algo , string $filename [, bool $binary = false ] )
  • $ algo : spécifie l'algorithme de hachage utilisé, comme MD5 , SHA256 , etc.

  • $ nom de fichier : chemin de fichier, indiquant le fichier pour calculer la valeur de hachage.

  • $ binaire : si vrai , renvoyez la valeur de hachage binaire; Si faux , renvoyez la valeur de hachage hexadécimal.

Par exemple, calculez la valeur de hachage SHA256 d'un fichier:

 $fileHash = hash_file('sha256', 'largefile.txt');

hash_file () est un moyen très simple car il lit automatiquement l'ensemble du fichier et calcule la valeur de hachage. Cependant, lors du traitement des fichiers volumineux, la lecture directe du fichier entier peut entraîner une consommation élevée de mémoire, en particulier dans des environnements avec des ressources de mémoire limitées.

2. Introduction à hash_update_stream ()

Contrairement à hash_file () , hash_update_stream () est une méthode de calcul des valeurs de hachage dans les segments, ce qui permet au contenu du fichier d'être lu étape par étape lors du calcul du hachage. Ceci est particulièrement utile pour les fichiers volumineux, car il ne nécessite pas que l'ensemble du fichier soit chargé en mémoire à la fois, mais peut être traité de morceau par bloc.

 bool hash_update_stream ( resource $context , string $data [, int $length = 0 ] )
  • $ Context : est un contexte de hachage créé via hash_init () .

  • $ DATA : Une partie des données à calculer.

  • $ Longueur : Paramètre facultatif, spécifiant la longueur des données à lire.

Les étapes de base pour calculer un hachage de fichiers important sont les suivantes:

 $hashContext = hash_init('sha256');  // Initialiser le contexte du hachage
$handle = fopen('largefile.txt', 'rb');  // Ouvrir le fichier

while (!feof($handle)) {
    $data = fread($handle, 8192);  // Lire des fichiers en morceaux
    hash_update_stream($hashContext, $data);  // Mettre à jour le hachage
}

$hash = hash_final($hashContext);  // Obtenez la valeur de hachage finale
fclose($handle);

En lisant progressivement des fichiers en morceaux et en mettant à jour les valeurs de hachage, cette méthode peut gérer la mémoire plus efficacement et convient au traitement des fichiers volumineux.

3. Analyse de la différence de performance

3.1 Utilisation de la mémoire

  • hash_file () : Cette fonction chargera le fichier entier en mémoire en même temps pour le calcul du hachage, adapté aux situations où la taille du fichier est modérée. Si le fichier est très grand (comme plusieurs GB), il entraînera une utilisation excessive de la mémoire et provoquera des erreurs de débordement de mémoire.

  • hash_update_stream () : Cette méthode lit le fichier étape par étape et met à jour la valeur de hachage, de sorte que l'utilisation de la mémoire est plus faible. Pour les fichiers volumineux, hash_update_stream () présente plus d'avantages car il stocke les données uniquement dans chaque bloc de fichiers de lecture, évitant ainsi l'exigence de mémoire élevée de chargement tout le fichier.

3,2 Différence de vitesse

En termes de vitesse, hash_file () a généralement des performances plus élevées car il s'agit d'une fonction sous-jacente qui appelle directement la fonction de lecture de fichiers du système d'exploitation sans nécessiter une allocation ou un traitement de mémoire supplémentaire. Cependant, à mesure que la taille du fichier augmente, ses performances peuvent être affectées par les limitations de la mémoire.

En revanche, hash_update_stream () nécessite plus de logique d'exécution de code (comme la lecture en morceaux et la mise à jour progressive du hachage), mais lorsqu'ils traitent avec de grands fichiers, ses performances globales ont tendance à être meilleure en raison de la gestion de la mémoire plus efficace.

3.3 Flexibilité

hash_update_stream () offre plus de flexibilité. Les développeurs peuvent contrôler la taille de chaque fichier de lecture (spécifié par Fread () ) pour trouver un équilibre entre l'empreinte de la mémoire et la vitesse. Pour les fichiers grands, la taille du bloc de lecture peut être ajustée en fonction de la mémoire du serveur pour optimiser les performances.

3.4 Scénarios d'application pratiques

  • Utilisez hash_file () : lorsque les fichiers traités sont petits et que la mémoire système est suffisante, hash_file () est plus concise et efficace.

  • Utilisez hash_update_stream () : lorsque le fichier traité est très grand, ou dans un environnement limité par la mémoire, hash_update_stream () est plus approprié car il peut réduire l'utilisation de la mémoire par lecture en morceaux.

4. Test de performance

Pour vérifier davantage les différences de performances entre les deux, nous pouvons les tester avec un simple morceau de code.

4.1 Test avec hash_file ()

 $start = microtime(true);
$hash = hash_file('sha256', 'largefile.txt');
$end = microtime(true);
echo "hash_file took: " . ($end - $start) . " seconds.\n";

4.2 Test avec hash_update_stream ()

 $start = microtime(true);
$hashContext = hash_init('sha256');
$handle = fopen('largefile.txt', 'rb');
while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update_stream($hashContext, $data);
}
$hash = hash_final($hashContext);
fclose($handle);
$end = microtime(true);
echo "hash_update_stream took: " . ($end - $start) . " seconds.\n";

En comparant le temps d'exécution des deux pièces de code, nous pouvons comprendre intuitivement les différences de performances entre les deux méthodes dans les scénarios réels.

5. Résumé

  • Pour les fichiers petits et moyens, hash_file () est simple et facile à utiliser, plus rapidement et est suffisant pour répondre à la plupart des besoins.

  • Pour les fichiers volumineux, hash_update_stream () fournit un meilleur contrôle de la mémoire et convient pour une utilisation dans des environnements limités à la mémoire.

Le choix de la bonne méthode de hachage peut non seulement améliorer les performances, mais également éviter le gaspillage de ressources. Pour le traitement des fichiers importants, il est recommandé d'utiliser hash_update_stream () car il a une empreinte mémoire plus faible et des performances plus stables.