はじめに
PHP8上級試験の問題集には、「hash() 関数はソルトを自動で付与するため毎回異なる出力になる」 というトラップ的な記述があります。しかし実際には、hash() 関数はソルトを付与しません。同じ入力に対しては、常に同じ結果を返します。
この記事では、試験対策として hash() と password_hash() の違いを整理します。
目次
hash() 関数の仕様
hash(
string $algo,
string $data,
bool $binary = false,
array $options = []
): string$algo: アルゴリズム(例:"sha256","md5")$data: 入力データ$binary: 出力形式(デフォルトは16進数文字列)$options: 一部のアルゴリズムで利用可能
👉 重要:ソルトは自動で付与されない。
実行例
<?php
declare(strict_types=1);
error_reporting(-1);
for($i = 0; $i < 3; ++$i){
var_dump(hash('sha256', 'aaa'));
}出力結果(例)
string(64) "9834876d...(固定のハッシュ値)"
string(64) "9834876d...(同じ値)"
string(64) "9834876d...(同じ値)"同じ入力に対しては、毎回同じハッシュ値が得られます。
password_hash() との違い
password_hash() は毎回ランダムなソルトを自動で付与するため、同じ入力でも出力が異なります。
<?php
echo password_hash('aaa', PASSWORD_DEFAULT) . PHP_EOL;
echo password_hash('aaa', PASSWORD_DEFAULT) . PHP_EOL;出力結果(例)
$2y$10$yRb5...(毎回異なる)
$2y$10$dKf1...(毎回異なる)まとめ
hash()… ソルトなし。同じ入力なら常に同じ結果。password_hash()… 自動ソルトあり。同じ入力でも毎回違う結果。- 試験では 「hash() は毎回違う出力を返す」という記述は誤り に注意!
👉 この記事を読んだ受験者は、「ソルトが絡むのは password_hash() のほう」と瞬時に区別できるようになります。
