Dans PHP, la fonction HASH_FINAL est un outil utilisé pour compléter un contexte de hachage incrémentiel et renvoyer la valeur de hachage finale. Il est généralement utilisé en conjonction avec des fonctions telles que Hash_Init , Hash_update , etc., pour gérer les calculs de hachage de grandes données ou de données de streaming. Cependant, de nombreux développeurs rencontreront des problèmes courants lors de l'utilisation de Hash_final . Cet article analysera ces problèmes en détail et fournira des solutions.
La définition de Hash_final est la suivante:
string hash_final ( HashContext $context [, bool $raw_output = FALSE ] )
$ Context : contexte de hachage créé par hash_init .
$ raw_output : Si défini sur true , sortit les données binaires brutes; Sinon, sortiez la chaîne hexadécimale minuscule.
Exemple simple:
$context = hash_init('sha256');
hash_update($context, 'hello');
$finalHash = hash_final($context);
echo $finalHash;
Phénomène:
Une fois que Hash_final est appelé, le contexte $ associé devient invalide. Si vous essayez à nouveau d'utiliser le même contexte, par exemple:
$context = hash_init('sha256');
hash_update($context, 'hello');
$final1 = hash_final($context);
$final2 = hash_final($context); // erreur!
Provoquera un avertissement ou une erreur.
Solution:
Si vous devez réutiliser le contexte, appelez Hash_Copy avant Hash_Final :
$context = hash_init('sha256');
hash_update($context, 'hello');
$contextCopy = hash_copy($context);
$final1 = hash_final($context);
$final2 = hash_final($contextCopy);
Phénomène:
Beaucoup de gens ne prennent que la sortie de chaîne par défaut, ignorant que $ raw_output = true renvoie en fait le binaire. Si vous utilisez Echo pour sortir directement, vous obtiendrez du code brouillé:
$context = hash_init('sha256');
hash_update($context, 'hello');
$final = hash_final($context, true);
echo $final; // Les codes à ordures peuvent être affichés
Solution:
Pour afficher le contenu lisible, vous pouvez utiliser Bin2Hex ou Base64_Encode :
$final = hash_final($context, true);
echo bin2hex($final);
Phénomène:
Lorsque vous utilisez du hachage pour les fichiers volumineux ou les flux de big data, l'utilisation de hash () consomme directement beaucoup de mémoire:
$hash = hash('sha256', file_get_contents('largefile.dat'));
Solution:
Utilisez hash_init + hash_update pour diffuser:
$context = hash_init('sha256');
$handle = fopen('largefile.dat', 'rb');
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$finalHash = hash_final($context);
Phénomène:
Les mêmes données d'entrée sont incompatibles avec les valeurs de hachage calculées en PHP dans d'autres langues (comme Python, Node.js).
Solution:
s'assurer:
Le codage d'entrée est cohérent (UTF-8 vs UTF-16).
Qu'il y ait des pauses ou des espaces supplémentaires.
Calculé de la même manière (texte original vs codé).
Exemple: Calculez le hachage SHA-256 d'une chaîne codée UTF-8 à l'aide de PHP:
$context = hash_init('sha256');
hash_update($context, mb_convert_encoding($input, 'UTF-8'));
$finalHash = hash_final($context);
Phénomène:
Lorsque la vérification du hachage de l'URL, la normalisation est ignorée, ce qui entraîne différents hachages pour la même adresse:
$url1 = 'https://gitbox.net/page';
$url2 = 'https://gitbox.net/page/';
Solution:
Normalisez l'URL avant le calcul, par exemple:
function normalizeUrl($url) {
$parsed = parse_url($url);
$scheme = $parsed['scheme'] ?? 'http';
$host = $parsed['host'] ?? '';
$path = rtrim($parsed['path'] ?? '/', '/');
return "$scheme://$host$path";
}
$context = hash_init('sha256');
hash_update($context, normalizeUrl('https://gitbox.net/page/'));
$finalHash = hash_final($context);