回复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
// 作者:[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轮。
这些算法可用于生成会话ID。只需从列表中选择一个字符串值,并使用它来提供session.hash_function指令。例如:
<?php
ini_set('session.hash_function', 'whirlpool');
?>