【发布时间】:2012-04-06 11:29:18
【问题描述】:
我在我的 WWW 框架中使用了大量的 API 调用缓存和缓冲,而我最终使用的其中一件事是“指纹”数据以匹配缓存文件名以及检测具有已经制作好了。
大量数据在数组中移动,例如 GET、POST 等。因此,API 调用的唯一性取决于数据。
因此,我需要对这些信息进行指纹识别。要做到这一点,还需要从数据数组中生成一个“指纹”,并将其散列成一个我可以存储和比较的字符串。
对于数组序列化,PHP 中有 serialize() 和 json_encode()。经过各种基准测试后,我认为 json_encode() 是序列化数组的更快方法,并且对它非常满意。
对于散列,有 md5() 和 sha1() 函数,根据我的基准,其中 md5() 更快。
所以我目前的指纹算法是:
$fingerprint=md5(json_encode($array));
但我怀疑这是否是在 PHP 中对数组进行指纹识别的“最快”方法。我已经尝试过 Google 和 StackOverflow,但还没有找到好的替代品。我是在正确的轨道上还是我需要做一些不同的事情?
【问题讨论】:
-
md5(var_export($data, true))比较如何?另外 - 想知道您是否可以依靠json_encode来保存订单。错过缓存会很糟糕,因为键顺序不同。 -
根据我的测试, var_export() 比 serialize() 快,但比 json_encode() 慢。我正在研究 crc32() 来替换 md5(),需要测试。
-
好吧,显然(令我惊讶的是) crc32() 实际上比 md5() 慢,当然更容易发生可能的冲突。所以我又回到了以前的 md5(json_encode($array));
-
我认为你已经尽可能多地挤出了它。您可能会考虑只存储/分析 GET/POST 变量本身,甚至是 JSON 字符串。我不知道你是否考虑过,但如果 GET/POST 的顺序不同,它的指纹就会完全不同。
-
另外,我听说 hash('md5',"") 更快,而 hash('md4',"") 甚至比这更快。不过,您必须在自己的系统上对其进行测试。
标签: php arrays hash fingerprint