mhash扩展在php 7.0+中已被完全移除,php 5.3.0起其功能已并入hash扩展;应使用hash()替代mhash(),如hash('md5', 'data'),并确认hash扩展已启用。

phpenv 本身不负责编译或启用 PHP 扩展,它只管理多个 PHP 版本的切换。是否能用 mhash,取决于你当前用的 PHP 版本在编译时是否启用了该扩展,以及运行时是否加载了它。
而现实是:PHP 5.3.0 起,mhash 功能已并入 hash 扩展;PHP 7.0+ 完全移除了 mhash 扩展,mhash() 函数不可用。你现在看到的任何“开启 mhash”的操作,基本都指向一个过时路径,甚至会失败。
下面分场景说明怎么做、为什么、容易踩什么坑:
确认当前 PHP 是否还支持 mhash()
先执行:
php -r "var_dump(function_exists('mhash'));"
如果输出 bool(false),说明函数不存在——不是没开启,是根本没编译进去,或者版本太高已被删。
再查下版本:php -v- PHP 7.0 及以上 →
mhash 已废弃且不可恢复,别折腾
- PHP 5.6 或更早(且非精简编译)→ 才有可能存在
phpenv 环境下怎么检查 hash 扩展是否启用
mhash 的替代方案就是 hash 扩展,它从 PHP 5.1.2 起默认启用,且覆盖全部 mhash 支持的算法。验证方式:
php -m | grep hash应输出
hash。若无,说明 PHP 编译时禁用了它(极少见),需重装该版本 PHP 并确保不加 --disable-hash。
你也可以直接测试:php -r "echo hash('md5', 'hello');"
能输出 32 位 hex 字符串,就代表 hash 正常工作。
为什么不要费劲去“开启 mhash”
即使你在 PHP 5.6 下通过源码编译硬加上 --with-mhash,也会遇到这些问题:
- mhash() 返回二进制数据,不加 bin2hex() 直接 echo 会乱码或截断
- 算法常量如 MHASH_MD5 不再被识别(PHP 7+ 报 undefined constant)
- hash_hmac() 和 hash() 接口更统一、参数更清晰、文档更全
- hash_algos() 能列出所有可用算法,比 mhash_count() + 循环查名字直观得多
实际迁移建议:用 hash() 替代 mhash()
原来这样写:
$hash = bin2hex(mhash(MHASH_MD5, "data"));现在直接:
$hash = hash('md5', 'data');
HMAC 场景:$hmac = hash_hmac('sha256', 'data', 'key');
注意三点:
- hash() 默认返回小写 hex 字符串,和 bin2hex(mhash(...)) 行为一致
- 所有算法名用字符串(如 'sha256'),不是常量
- 若需原始二进制输出,加第三个参数 true:hash('md5', 'data', true)真正卡住人的地方,往往不是“怎么开”,而是没意识到 mhash 已死、hash 已接管——而且接管得更干净。别在旧接口上补丁,直接切到标准方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











