現在の位置: ホーム> 最新記事一覧> hash_finalハッシュ値を計算するときに異なるデータ形式を扱う方法は?

hash_finalハッシュ値を計算するときに異なるデータ形式を扱う方法は?

gitbox 2025-05-27

PHPでは、 hash_final関数を使用して、ハッシュコンテキストの最後のステップ( hash_initによって作成)を完了し、計算されたハッシュ値を返します。 PHPのハッシュ拡張に属し、通常はHash_inithash_updatehash_update_streamhash_update_fileで使用されます。

したがって、 hash_finalを使用してハッシュ値を計算する場合、さまざまなデータ形式(文字列、バイナリデータ、ファイルストリームなど)をどのように処理しますか?この記事については詳細に説明します。

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番目のパラメーターは文字列です。

  • どのタイプを提供しても(文字列に変換できる限り)、最終的にバイトシーケンスとして処理されます。

さまざまなデータ形式を処理する方法

1 ??弦

文字列(ASCIIまたはUTF-8エンコーディングのいずれであっても)を渡すと、PHPはバイトシーケンスで直接処理します。
例えば:

 hash_update($context, "abc");  // 何が扱っているのか '61 62 63' 3バイト

注:マルチバイト文字(中国語など)は、「文字」の粒度ではなく、基礎となるバイトシーケンスに従ってハッシュを入力することによって計算されます。

2 ??バイナリデータ

たとえば、 file_get_contentsを介して取得されたバイナリストリームをバイナリデータに渡すと、バイトによって直接供給されます。

 $data = file_get_contents('https://gitbox.net/image.png');
hash_update($context, $data);

ここの$データには、 \ 0 (null byte)、高バイトなどが含まれる場合があります。PHPはフィルタリングまたはエスケープを実行せず、ハッシュ計算をそのまま入力します。

3 ??ファイルストリーム

大きなファイルに対してハッシュを計算する場合は、 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);

ここでは、ファイルコンテンツがチャンクで読み取られ、ハッシュコンテキストに供給され、ファイル全体を一度にメモリにロードすることを避けます。

4 ??ファイルパス

ファイルでハッシュを直接計算する場合は、 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_updatehash_update_streamhash_update_file )がバイトシーケンスで読み取られ、元の「データ型」については気にしません。

  • あなたが渡すデータがあなたが持っているものであることを確認する必要があります(特にエンコードまたはバイナリセキュリティの問題)。