Lors du traitement des opérations de hachage en PHP, l'ensemble des fonctions hash_init () , hash_update () et hash_final () sont une combinaison très puissante. Ils fournissent un moyen de streaming (segmenté) de calculer les valeurs de hachage, ce qui convient au traitement des fichiers volumineux ou des données enfières, et est plus efficace que d'utiliser la fonction hash () à la fois.
Cet article expliquera en détail comment utiliser correctement hash_update () et hash_final () , et souligner les choses auxquelles être prêts attention.
Le processus de base de ces trois fonctions est le suivant:
Initialiser le contexte du hachage:
$context = hash_init('sha256');
Données mises à jour plusieurs fois:
hash_update($context, 'Partie des données1');
hash_update($context, 'Partie des données2');
Obtenez la valeur de hachage finale:
$hash = hash_final($context);
Exemple complet:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello ');
hash_update($context, 'World!');
$finalHash = hash_final($context);
echo "Valeur de hachage finale: " . $finalHash;
?>
1 ?? Le contexte ne peut pas être utilisé à nouveau après que hash_final () est appelé
Lorsque vous appelez:
$hash = hash_final($context);
Le contexte de contexte est détruit , et vous ne pouvez plus l'utiliser pour continuer à appeler hash_update () ou hash_final () , sinon une erreur sera signalée.
Si vous souhaitez continuer à compter d'autres hachages sur le même flux de données, vous devez à nouveau appeler hash_init () .
2 ?? Utilisez Hash_Copy () comme une branche
Si vous avez besoin d'obtenir plusieurs résultats de branche en fonction du même contexte, vous pouvez utiliser Hash_Copy () :
$context = hash_init('sha256');
hash_update($context, 'Partie des données');
$copy = hash_copy($context);
hash_update($context, 'UltérieurA');
$hashA = hash_final($context);
hash_update($copy, 'UltérieurB');
$hashB = hash_final($copy);
De cette façon, $ Hasha et $ hashb sont les résultats de différentes succursales.
3 ?? Mettre à jour par bloc lors du traitement des fichiers volumineux
Pour les fichiers volumineux, vous pouvez lire et appeler hash_update () en morceaux:
<?php
$context = hash_init('sha256');
$handle = fopen('largefile.bin', 'rb');
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "Grande valeur de hachage de fichiers: " . $finalHash;
?>
Cela évite la pression de la mémoire causée par la lecture de fichiers à la fois.
4 ?? Utiliser dans les scénarios d'URL
Si vous diffusez des données via la demande HTTP, par exemple:
<?php
$url = 'https://gitbox.net/sample-file.bin';
$context = hash_init('sha256');
$handle = fopen($url, 'rb');
if ($handle) {
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "Valeur de hachage de fichier distant: " . $finalHash;
} else {
echo "Impossible d'ouvrir URL。";
}
?>
Soyez prudent: assurez-vous que perte_url_fopen est activé dans php.ini , sinon fopen () ne peut pas ouvrir directement l'URL.
5 ?? Choisissez le bon algorithme
Le premier paramètre de hash_init () est le nom de l'algorithme. Il est recommandé d'utiliser des algorithmes modernes tels que SHA256 et SHA512 au lieu d'anciens MD5 ou SHA1 , car ce dernier n'est plus sûr.