Почему crypt () генерирует разные результаты?

Crypt генерирует разные хеши с одними и теми же входными данными, и ранее [функциональный] генератор / проверка хешей больше не работает для аутентификации пользователей:

public static function blowfish($password, $storedpass = false) {
    //if encrypted data is passed, check it against input ($info) 
      if ($storedpass) { 
            if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { 
                return true; 
            }  else { 
                return false; 
            } 
      }  else { 
          //make a salt and hash it with input, and add salt to end 
          $salt = ""; 
          for ($i = 0; $i < 22; $i++) { 
            $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          } 
          //return 82 char string (60 char hash & 22 char salt) 
          return crypt($password, "$2y$08$".$salt).$salt; 
     }
}

Я бьюсь головой об стену и не нашел ответов на различия между внутренними алгоритмами Zend и PHP против алгоритмов операционной системы; или вариации между PHP 5.3.8 и ранее ...

РЕДАКТИРОВАТЬ: мой вопрос технически ответил, и это моя вина, я не задал правильно. Я реализовал:

$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
          //for ($i = 0; $i < 22; $i++) { 
            //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); 
          //} 

Мой настоящий вопрос: почему следующие функции возвращаются по-разному?

print(substr($storedpass, 0, 60)."<br />");

возврат: $ 2y $ 08 $ 43f053b1538df81054d4cOJyrO5 / j7NtZBCw6LrFof29cLBs7giK6

print(crypt($password, "$2a$08$".substr($storedpass, 60)));

Возвращает: $ 2a $ 08 $ 43f053b1538df81054d4cOPSGh / LMc0PZx6RC6PlXOSc61BKq / F6.

Ответы на вопрос(1)

Ваш ответ на вопрос