Position actuelle: Accueil> Derniers articles> Comment utiliser Hash_Final pour réaliser la vérification de l'intégrité des données dans PHP?

Comment utiliser Hash_Final pour réaliser la vérification de l'intégrité des données dans PHP?

gitbox 2025-05-29

Dans le développement Web moderne, la vérification de l'intégrité des données est une tâche très importante. Nous devons nous assurer que lors de la transmission ou du stockage des données, les données ne sont pas falsifiées ou corrompues. PHP fournit une variété de fonctions liées au hachage pour aider les développeurs à atteindre cette exigence, parmi laquelle Hash_Final () est l'une des fonctions principales utilisées pour le traitement de contexte de hachage. Cet article analysera en détail l'objectif, le principe de travail de Hash_Final () , et comment l'utiliser dans des projets réels pour la vérification de l'intégrité des données.

1. Qu'est-ce que Hash_Final?

Hash_Final () est une fonction dans l'extension de hachage fournie par PHP pour obtenir la valeur de hachage finale dans une opération de hachage incrémentielle. Il est généralement utilisé avec hash_init () et hash_update () et convient pour gérer des fichiers ou des scénarios importants où les valeurs de hachage doivent être calculées dans des segments.

Utilisation de base:

 string hash_final ( HashContext $context [, bool $raw_output = false ] )
  • $ Context : Hash Context créé par hash_init () .

  • $ raw_output (facultatif): si cela est vrai , il obtient une valeur de hachage au format binaire d'origine, sinon publie une chaîne hexadécimale.

2. Pourquoi utiliser hash_final au lieu de hash ()?

Bien que la fonction hash () puisse calculer la valeur de hachage d'une chaîne ou d'un fichier en même temps, hash_final () convient plus dans les scénarios suivants:

  1. Traiter les fichiers volumineux ou les données de streaming:
    La lecture de l'ensemble du fichier en mémoire peut provoquer un débordement de mémoire, tandis que l'utilisation de hash_init () + hash_update () peut lire le fichier dans des segments et mettre à jour le hachage étape par étape.

  2. Traitement en plusieurs étapes:
    Si les données sont reçues en morceaux (tels que les flux de réseau ou les données fragmentées à partir de systèmes distribués), le hachage peut être progressivement mis à jour et finalement le résultat peut être généré avec hash_final () .

  3. Contrôle plus flexible:
    L'algorithme de hachage peut être sélectionné dynamiquement et la logique de traitement peut être ajustée en fonction des besoins de l'entreprise au milieu.

3. Application pratique: vérifiez l'intégrité du fichier

Voici un exemple d'utilisation de hash_final () pour vérifier l'intégrité du fichier:

 <?php
$file = 'largefile.zip';
$expectedHash = 'e99a18c428cb38d5f260853678922e03'; // AttenduMD5Valeur de hachage

$context = hash_init('md5');
$handle = fopen($file, 'rb');

if (!$handle) {
    die("Impossible d&#39;ouvrir le fichier: $file");
}

while (!feof($handle)) {
    $data = fread($handle, 8192); // Chaque lecture8KB
    hash_update($context, $data);
}

fclose($handle);

$calculatedHash = hash_final($context);

if ($calculatedHash === $expectedHash) {
    echo "La vérification de l&#39;intégrité du fichier a été adoptée。";
} else {
    echo "Le fichier a été corrompu ou falsifié。";
}
?>

4. Utilisez des données d'URL pour la vérification

Si vous devez vérifier l'intégrité du fichier distant, vous pouvez utiliser fopen () pour ouvrir le flux distant (assurez-vous que perte_url_fopen est activé):

 <?php
$url = 'https://gitbox.net/files/sample.zip';
$expectedSha256 = '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08';

$context = hash_init('sha256');
$handle = fopen($url, 'rb');

if (!$handle) {
    die("Impossible d&#39;ouvrirURL: $url");
}

while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update($context, $data);
}

fclose($handle);

$calculatedSha256 = hash_final($context);

if ($calculatedSha256 === $expectedSha256) {
    echo "远程La vérification de l&#39;intégrité du fichier a été adoptée。";
} else {
    echo "远程Le fichier a été corrompu ou falsifié。";
}
?>