如果您印出 hash_algos 函式的結果並查看所有可用的雜湊函式,您會發現三個具有重複函式的函式:md5、sha1、crc32 和 sha256。這表示您可以使用其自身的函式或雜湊函式來呼叫這些函式。例如,使用 SHA1 函式
<?php
$sha1_first_value = sha1("secret", FALSE);
$sha1_second_value = hash("sha1", "secret", FALSE);
?>
然而,SHA256 演算法的另一個名稱是「getImageSignature」,它是 ImageMagick 應用程式套件的一部分。奇怪的是,從其特定函式 (crc32()) 呼叫 CRC32 函式時,與透過雜湊函式 (hash()) 呼叫時,傳回的值不同。這讓我懷疑它們可能是 crc32 演算法的不同實作。然而,SHA1 和 MD5 的不同函式會產生相同的結果。ImageMagick 函式中實作的 SHA-256 演算法與 Hash 應用程式套件中 hash_file() 函式的結果也產生不同的結果。
對於字串「1234567890」,單個 CRC32() 函式(沒有二進位制「原始資料」表示法的選項)產生「639479525」,但透過 Hash() 函式呼叫時,同一個字串會產生「b6536850」。我找不到這些值的任何關係,因為它們不是彼此的倒數,它們的和或差也不等於任何 2 的次方(我懷疑它們可能與 0 或 2^32 等距)。
SHA1 和 MD5 的替代函式在結尾都有參數「TRUE/FALSE」,用於指示結果是否以二進位制(原始資料)給出。遺憾的是,這通常會導致資料無法正確顯示。建議使用 printf("%u\n", $crc_32_value); 陳述式來顯示。然而,這通常也不會產生任何可用的結果。我發現的唯一方法是「bin2hex」函式,如下所示
<?php
$md5_value = hash("md5", "secret", FALSE);
$md5_value_in_hex = bin2hex($md5_value);
?>
然而,`bin2hex` 返回的是十六進位表示法,而您可能想要的是一個由二進位 1 和 0 組成的字串。您可以使用 `base_convert` 函式,例如 `base_convert($md5_value_in_hex, 16, 2);`。但是,`base_convert` 無法處理大數字,因此您必須自行編寫函式來將十六進位轉換為二進位。
另一個可能會引起您注意的事情是,列出的演算法中有一半的名稱相似,但以不同的數字表示。這表示演算法本身帶有參數,例如結果雜湊值的位數和產生雜湊結果的輪數。雜湊函式名稱中的第一個數字通常表示雜湊結果的大小,例如 "haval128,3" 的 128 位元和 "tiger160,4" 的 160 位元。然而,第二個數字表示輪數,例如 "haval224,5" 的 5 輪。