回答 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。这意味着你可以使用其自身的函数或哈希函数调用这些函数中的任何一个。例如,使用 SHA1 函数
<?php
// 作者:[email protected]
$sha1_first_value = sha1("secret", FALSE);
$sha1_second_value = hash("sha1", "secret", FALSE);
?>
但是,SHA256 算法的备用标题是“getImageSignature”,作为 ImageMagick 应用程序包的一部分。奇怪的是,CRC32 函数从其自身的特定函数(crc32())调用时返回不同的值,而从哈希函数(hash())调用时返回不同的值。这让我怀疑它们可能是 crc32 算法的完全不同的实现。然而,SHA1 和 MD5 的不同函数产生相同的结果。SHA-256 算法(在 ImageMagick 函数中实现)也产生与 Hash 应用程序包中的 hash_file() 函数的结果不同的结果。
对于字符串“1234567890”,单个 CRC32() 函数(没有二进制“原始数据”表示的选项)产生“639479525”,但通过 Hash() 函数调用时,相同字符串产生“b6536850”。我无法找到这些值之间的任何关系,因为它们不是彼此的倒数,它们的和或差也不等于任何二的幂(正如我怀疑它们可能与 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');
?>