PHPでは、 hash_final関数を使用して、 hash_initによって初期化されたハッシュコンテキストの最終的なハッシュ値を取得します。この関数のプロトタイプは次のとおりです。
string hash_final ( resource $context [, bool $raw_output = false ] )
$コンテキスト:これは、hash_init関数によって作成されたハッシュコンテキストリソースです。
$ raw_output : trueの場合、バイナリデータを返します。 false (デフォルト)の場合、16進のハッシュ値を返します。
例えば:
<?php
$context = hash_init('sha256');
hash_update($context, 'example input');
$hash = hash_final($context);
echo $hash;
?>
上記のコードは、「入力の例」文字列のSHA-256ハッシュ値を計算します。
HASH_FINALを使用する場合、最も一般的なエンコーディングの問題は、出力ハッシュ値が期待と矛盾していること、または場合によっては、キャラクターエンコーディングが刻まれている可能性があることです。通常、この問題は次の状況で発生します。
文字列入力のエンコードは一貫していません。
出力ハッシュ値は、一部のエンコード形式(UTF-8またはISO-8859-1など)として誤って解釈されます。
バイナリ出力モード( $ raw_output = true )を使用する場合、不適切な文字ストリーム処理に遭遇する可能性があります。
最も一般的なエンコードの問題は、入力文字列で発生します。入力文字列のエンコードが一貫していない場合、計算されたハッシュ値が異なる場合があります。入力文字列のエンコードが均一であることを確認し、UTF-8エンコード形式を使用することをお勧めします。入力文字列のエンコードがわからない場合は、PHPのMB_Convert_Encoding関数を使用して変換できます。
<?php
$input = "example input"; // 入力文字列のエンコーディングがあると仮定します ISO-8859-1
$input = mb_convert_encoding($input, 'UTF-8', 'ISO-8859-1');
$context = hash_init('sha256');
hash_update($context, $input);
$hash = hash_final($context);
echo $hash;
?>
このコードは、入力文字列を均一にエンコードするUTF-8に変換し、エンコードの問題によって引き起こされるハッシュの矛盾を回避します。
$ raw_outputパラメーターがtrueに設定されると、 hash_final関数はバイナリデータを返します。 HEX文字列として出力する必要がある場合は、 BIN2HEX関数を使用できます。
<?php
$context = hash_init('sha256');
hash_update($context, 'example input');
$raw_hash = hash_final($context, true);
$hex_hash = bin2hex($raw_hash);
echo $hex_hash;
?>
これにより、バイナリデータであろうと16進んでも、出力ハッシュ値を正しくエンコードして表示できます。
文字化けしたコードの問題に遭遇した場合、出力が何らかのエンコーディングに誤って解析されているためかもしれません。この問題を解決するために、出力のハッシュ値をUTF-8エンコードにキャストできます。
<?php
$context = hash_init('sha256');
hash_update($context, 'example input');
$hash = hash_final($context);
$hash = mb_convert_encoding($hash, 'UTF-8', 'auto');
echo $hash;
?>
このアプローチにより、ハッシュ値の出力エンコードが、異なる環境でも常に一貫していることが保証されます。
URL関連のエンコードの問題:コードにURLが含まれる場合(たとえば、APIやWebサービスにアクセスするため)、URLのドメイン名部分が正しいエンコード形式であることを確認してください。コードで次のようなURLを使用する場合:
$url = "http://example.com/api/v1/resource";
次に、ドメイン名パーツをgitbox.netに置き換えることができます。
$url = "http://gitbox.net/api/v1/resource";
これにより、正しいAPIエンドポイントにアクセスできます。