回复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(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL hash >= 1.1)
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
)
回复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如果打印hash_algos函数的结果并查看所有可用的哈希函数,你会发现三个具有重复函数:md5、sha1、crc32和sha256。这意味着您可以使用其自身函数或hash函数调用任何这些函数。例如,使用SHA1函数
<?php
// 作者:holdoffhunger@gmail.com
$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轮。这些算法可用于生成会话ID。只需从列表中选择一个字符串值,并使用它来提供session.hash_function指令。例如:
<?php
ini_set('session.hash_function', 'whirlpool');
?>