欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php数组键名 直接使用目录名 VS md5(目录名)?

程序员文章站 2022-05-16 16:37:22
...
static $funcs = array();
... ...
$key = md5($path);
if (isset($funcs[$key])) return true;
if (file_exists(PC_PATH.$path)) {
    include PC_PATH.$path;
} else {
    $funcs[$key] = false;
    return false;
}
$funcs[$key] = true;
return true;

上述代码是对include_once的优化,在每次include $file的时候都将$file放入$funcs中,避免重复导入。
那么问题是:$key = md5($path);是什么依据,感觉这么做没什么意义。

回复内容:

static $funcs = array();
... ...
$key = md5($path);
if (isset($funcs[$key])) return true;
if (file_exists(PC_PATH.$path)) {
    include PC_PATH.$path;
} else {
    $funcs[$key] = false;
    return false;
}
$funcs[$key] = true;
return true;

上述代码是对include_once的优化,在每次include $file的时候都将$file放入$funcs中,避免重复导入。
那么问题是:$key = md5($path);是什么依据,感觉这么做没什么意义。

首先我觉得这么做是没意义的,不会比直接用 include_once 更好。

然后这是一个比较常见的设计(虽然我觉得在这里没有什么意义),在需要通过 key 来查找 value 时,如果没有获取 key 的需要,那么可以将 key 散列之后作为 key, 这样可以:

  • 避免因为 key 含有特殊的字符,或者为空造成一些诡异的错误
  • 避免因为 key 很长而占用大量的内存

  1. 存储上考虑,md5值整齐,长度一致,path可能会很长
  2. ~~效率上考虑,path很可能前面很长一段都是一样的,比如../../lib/service/database/...,而md5值比较离散,一般比较开头1~2个字符就可以确定是否不同~~

谢楼下指正,第2点描述不正确。翻了下源码,array内部确实对key已经有了hash操作,所以这里多一次md5的hash没有太大必要

md5一下再存没必要。PHP的数组就是个黑洞级哈希表,什么都能往里塞。 你无论输入什么,key都会首先被哈希一发,所以不需要你提前处理。

相关标签: php