编程

PHP 8.5: 所有的 MHASH_* 常量弃用

23 2024-12-28 01:11:00

PHP 核心中捆绑的 Hash 扩展包括一个向后兼容层,用于哈希扩展过时的 PHP 函数的 mhash 类。只有当 PHP 使用 --with-mhash 配置编译时,才会添加这些函数。

在 PHP 8.1 中,所有 mhash 函数都被弃用。包括 mhashmhash_countmhash_get_block_sizemhash-get_hash_namemhash_keygen_s2k 函数。

然而,在 PHP 8.1 中,这些函数接受为参数的 PHP 常量并没有被弃用。在 PHP 8.5 中,所有 MHASH_* 常量以及现有的 mhash 函数都被弃用。

以下代码段在 PHP 8.1 及更高版本上发出了一条关于 mhash 函数弃用的弃用消息:

mhash(MHASH_SHA1, 'test');
Function mhash() is deprecated since 8.1 ...

在 PHP 8.5 及之后的版本,因为 MHASH_* 常量也被弃用了,同时也会发送以下弃用通知:

+ Constant MHASH_SHA1 is deprecated ....
  Function mhash() is deprecated since 8.1 ...

以下所有的 MHASH_* PHP 常量都在 PHP 8.4 中弃用了。使用 hash 函数时,轻参考 "hash() 时的字符串(string)值" 作为替代。

mhash 常量常量值hash()string
MHASH_CRC320crc32
MHASH_MD51md5
MHASH_SHA12sha1
MHASH_HAVAL2563haval256,3
MHASH_RIPEMD1605ripemd160
MHASH_TIGER7tiger192,3
MHASH_GOST8gost
MHASH_CRC32B9crc32b
MHASH_HAVAL22410haval224,3
MHASH_HAVAL19211haval192,3
MHASH_HAVAL16012haval160,3
MHASH_HAVAL12813haval128,3
MHASH_TIGER12814tiger128,3
MHASH_TIGER16015tiger160,3
MHASH_MD416md4
MHASH_SHA25617sha256
MHASH_ADLER3218adler32
MHASH_SHA22419sha224
MHASH_SHA51220sha512
MHASH_SHA38421sha384
MHASH_WHIRLPOOL22whirlpool
MHASH_RIPEMD12823ripemd128
MHASH_RIPEMD25624ripemd256
MHASH_RIPEMD32025ripemd320
MHASH_SNEFRU25627snefru256
MHASH_MD228md2
MHASH_FNV13229fnv132
MHASH_FNV1A3230fnv1a32
MHASH_FNV16431fnv164
MHASH_FNV1A6432fnv1a64
MHASH_JOAAT33joaat
MHASH_CRC32C34crc32c
MHASH_MURMUR3A35tiger160,3
MHASH_MURMUR3C36tiger160,3
MHASH_MURMUR3F37tiger160,3
MHASH_XXH3238tiger160,3
MHASH_XXH6439tiger160,3
MHASH_XXH340tiger160,3
MHASH_XXH12841tiger160,3

推荐的替代

mhash 函数弃用一样,为防止弃用通知,建议的替换是完全禁止使用 mhash函数和常量,而是使用 hash 函数族。

计算 hash 值

- $hash = mhash(MHASH_SHA1, 'test');
+ $hash = hash('sha1', 'test', true); 

hash 函数接受算法名称的字符串值(示例中为 sha1),而不是 mhash 中的常量。此外,默认情况下,hash 函数将计算出的哈希值作为十六进制值返回,除非 hash 函数的第三个参数设置为 true

计算 HMAC 值

计算 HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)可以使用与 mhash*() 家族相同的 mhash 函数来完成,不过也有有一个单独的 hash_hmac 函数可以直接实现。

- $hmac = mhash(MHASH_SHA1, 'test', 'secret-key');
+ $hmac = hash_hmac('sha1', 'test', 'secret-key', true);

向后兼容性影响

使用带有MHASH_* 常量的 mhash 函数的 PHP 应用现在会收到针对每个 MHASH_* 常量使用的额外弃用通知。

遵循建议的替换方法,使用 hash 函数进行跨版本兼容修复。

 

下一篇