Если вводить один и тот же пароль несколько раз- хеш всегда будет разный
нет. Вся суть хэш функций, что при всей своей необратимости они всегда выдают детерминированный результат, то есть простым языком на одни и те же входные параметры выдаются одни и те же выходные.
То есть один и тот же пароль
всегда даст один и тот же хэш.
Конкретно с bcrypt - это хэш с солью. То есть у него не 1 входной параметр (пароль), а 2 - пароль и соль. При создании нового хэша генерируется новая соль (в идеале крипто рандомом). Поэтому и меняется хэш. Это усложняет взлом, так как без соли я бы просто мог иметь заранее рассчитанный словарик хэшей для частых паролей, а с солью мне придется делать полный перебор, даже если у пользователя банальный qwerty пароль.
Для валидации соль хранится в базе вместе с хэшем, мы просто не генерируем новую соль, а хэшируем с сохраненной.