PHPでは、 hash_final関数を使用して、ハッシュコンテキストの最後のステップ( hash_initによって作成)を完了し、計算されたハッシュ値を返します。 PHPのハッシュ拡張に属し、通常はHash_init 、 hash_update 、 hash_update_stream 、 hash_update_fileで使用されます。
したがって、 hash_finalを使用してハッシュ値を計算する場合、さまざまなデータ形式(文字列、バイナリデータ、ファイルストリームなど)をどのように処理しますか?この記事については詳細に説明します。
まず基本的な例を見てみましょう。
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello World');
$hash = hash_final($context);
echo $hash;
?>
このコードスニペットは、STRING HELLO WORLDのSHA-256ハッシュ値を出力します(Hexadecimal)。
知らせ:
hash_updateによって受信された2番目のパラメーターは文字列です。
どのタイプを提供しても(文字列に変換できる限り)、最終的にバイトシーケンスとして処理されます。
文字列(ASCIIまたはUTF-8エンコーディングのいずれであっても)を渡すと、PHPはバイトシーケンスで直接処理します。
例えば:
hash_update($context, "abc"); // 何が扱っているのか '61 62 63' 3バイト
注:マルチバイト文字(中国語など)は、「文字」の粒度ではなく、基礎となるバイトシーケンスに従ってハッシュを入力することによって計算されます。
たとえば、 file_get_contentsを介して取得されたバイナリストリームをバイナリデータに渡すと、バイトによって直接供給されます。
$data = file_get_contents('https://gitbox.net/image.png');
hash_update($context, $data);
ここの$データには、 \ 0 (null byte)、高バイトなどが含まれる場合があります。PHPはフィルタリングまたはエスケープを実行せず、ハッシュ計算をそのまま入力します。
大きなファイルに対してハッシュを計算する場合は、 hash_update_streamを使用することをお勧めします。
$fp = fopen('https://gitbox.net/largefile.zip', 'rb');
$context = hash_init('sha256');
hash_update_stream($context, $fp);
$hash = hash_final($context);
fclose($fp);
ここでは、ファイルコンテンツがチャンクで読み取られ、ハッシュコンテキストに供給され、ファイル全体を一度にメモリにロードすることを避けます。
ファイルでハッシュを直接計算する場合は、 Hash_fileを使用できますが、 Hash_*機能ファミリを使用する場合は、次のことが必要です。
$context = hash_init('sha256');
hash_update_file($context, 'https://gitbox.net/document.pdf');
$hash = hash_final($context);
hash_update_fileは、ファイルを自動的に開き、その内容を読み取り、コンテキストを更新します。
hash_finalは蓄積されたデータを完了します。
データがコンテキスト( hash_update 、 hash_update_stream 、 hash_update_file )がバイトシーケンスで読み取られ、元の「データ型」については気にしません。
あなたが渡すデータがあなたが持っているものであることを確認する必要があります(特にエンコードまたはバイナリセキュリティの問題)。