PHP Conference Japan 2024

hash_algos

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

hash_algos返回已注册的哈希算法列表

描述

hash_algos(): array

参数

此函数没有参数。

返回值

返回一个数值索引数组,包含支持的哈希算法列表。

变更日志

版本 描述
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 条注释

20
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
9
holdoffhunger at gmail dot com
12年前
如果打印hash_algos函数的结果并查看所有可用的哈希函数,你会发现三个具有重复函数:md5、sha1、crc32和sha256。这意味着您可以使用其自身函数或hash函数调用任何这些函数。例如,使用SHA1函数

<?php

// 作者:[email protected]

$sha1_first_value = sha1("secret", FALSE);

$sha1_second_value = hash("sha1", "secret", FALSE);

?>

然而,SHA256算法的替代名称是“getImageSignature”,它是ImageMagick应用程序包的一部分。奇怪的是,当从其自身特定函数(crc32())调用时,CRC32函数返回的值与通过hash函数(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轮。
1
alvaro at demogracia dot com
14年前
这些算法可用于生成会话ID。只需从列表中选择一个字符串值,并使用它来提供session.hash_function指令。例如:

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