Почему hash_password() каждый раз генерирует разное значение?
Вопрос скорее не в том, почему (потому что итак понятно, что это из за соли, которая каждый раз разная), а в том, какой от этого смысл?
Если я запишу в базу такой сгенерированный пароль, а потом буду сравнивать введенное значения пользователя, зашифрованное этой функцией со значением в базе, то они будут разные, соответственно пользователь никогда не сможет войти на сайт.
Другое дело - использование любой другой функции, будь то sha256, sha512, да тот же md5. Они постоянно генерируют одно и то же значение, поэтому его всегда можно сравнить со значением в базе.
Например, вот результаты пяти последовательных обновлений страницы:
$2y$10$RDLrtq0/h0RVC/TqaA4Aiulmz8mVdM94LYnncKZJcuzhxyUpGswgG
$2y$10$aKa3M7zIJs1c/Ixe96IGOOPkJMKp6qE3fb90lJz2EYv/WnLvyGT4m
$2y$10$bZdTKRZi.pKUzaqLtjQza.y.grVV28gpqexrSOjHT9fQcsdSHsTF.
$2y$10$LrQcNYaWHkciYiP5sPurH.GoT5SQJZuHV5/8uG4eaSiVByckg4tte
$2y$10$Sh9ZMORDVKkYDsQyMEanF.ruyxADoPIENersv19bef/E7eqw/xLcW
Если я запишу в базу такой сгенерированный пароль, а потом буду сравнивать введенное значения пользователя, зашифрованное этой функцией со значением в базе, то они будут разные, соответственно пользователь никогда не сможет войти на сайт.
Не надо шифровать заново и сравнивать, используйте password_verify.