PHP Conference Japan 2024

hash_algos

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)

hash_algos返回已註冊雜湊演算法的清單

說明

hash_algos(): 陣列

參數

此函式沒有參數。

回傳值

返回一個以數字為索引的陣列,其中包含支援的雜湊演算法清單。

更新日誌

版本 說明
8.1.0 已新增 MurmurHash3 和 xxHash 演算法的支援。
7.4.0 已新增 crc32c 的支援。
7.1.0 已新增 sha512/224、sha512/256、sha3-224、sha3-256、sha3-384 和 sha3-512 的支援。

範例

範例 #1 hash_algos() 範例

從 PHP 8.1.0 開始,hash_algos() 將返回以下演算法名稱清單。

<?php
print_r
(hash_algos());
?>

以上範例將輸出類似以下的內容

Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
    [5] => sha256
    [6] => sha384
    [7] => sha512/224
    [8] => sha512/256
    [9] => sha512
    [10] => sha3-224
    [11] => sha3-256
    [12] => sha3-384
    [13] => sha3-512
    [14] => ripemd128
    [15] => ripemd160
    [16] => ripemd256
    [17] => ripemd320
    [18] => whirlpool
    [19] => tiger128,3
    [20] => tiger160,3
    [21] => tiger192,3
    [22] => tiger128,4
    [23] => tiger160,4
    [24] => tiger192,4
    [25] => snefru
    [26] => snefru256
    [27] => gost
    [28] => gost-crypto
    [29] => adler32
    [30] => crc32
    [31] => crc32b
    [32] => crc32c
    [33] => fnv132
    [34] => fnv1a32
    [35] => fnv164
    [36] => fnv1a64
    [37] => joaat
    [38] => murmur3a
    [39] => murmur3c
    [40] => murmur3f
    [41] => xxh32
    [42] => xxh64
    [43] => xxh3
    [44] => xxh128
    [45] => haval128,3
    [46] => haval160,3
    [47] => haval192,3
    [48] => haval224,3
    [49] => haval256,3
    [50] => haval128,4
    [51] => haval160,4
    [52] => haval192,4
    [53] => haval224,4
    [54] => haval256,4
    [55] => haval128,5
    [56] => haval160,5
    [57] => haval192,5
    [58] => haval224,5
    [59] => haval256,5
)

參見

  • hash() - 產生雜湊值(訊息摘要)
  • hash_hmac_algos() - 傳回已註冊且適用於 hash_hmac 的雜湊演算法清單
新增註解

使用者貢獻的註解 3 則註解

Miguel Florido
10 年前
回覆 holdoffhunger 避免使用 crc32,結果不同是因為 crc32(); 使用 'crc32b' 演算法。要確認這一點,只需編寫

echo hash('crc32b', 'The quick brown fox jumped over the lazy dog.'), "\n";
echo dechex (crc32('The quick brown fox jumped over the lazy dog.'));

並檢查兩者是否具有相同的結果

82a34642
82a34642
holdoffhunger at gmail dot com
12 年前
如果您印出 hash_algos 函式的結果並查看所有可用的雜湊函式,您會發現三個具有重複函式的函式:md5、sha1、crc32 和 sha256。這表示您可以使用其自身的函式或雜湊函式來呼叫這些函式。例如,使用 SHA1 函式

<?php

// 作者:holdoffhunger@gmail.com

$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 輪。
alvaro at demogracia dot com
14 年前
這些演算法可用於產生工作階段 ID。只需從列表中選擇一個字串值,並將其提供給 `session.hash_function` 指令。例如:

<?php
ini_set
('session.hash_function', 'whirlpool');
?>
To Top