kin*_*ple 5 php arrays hash fingerprint
我在我的 WWW 框架中使用了大量 API 调用的缓存和缓冲,我最终使用的其中一件事是“指纹”数据以匹配缓存文件名以及检测已经进行的 API 调用.
许多数据在数组中移动,例如 GET、POST 等。因此,API 调用的唯一性取决于数据。
因此,我需要对这些信息进行指纹识别。要做到这一点,还需要从数据数组中生成一个“指纹”,并将其散列成一个我可以存储和比较的字符串。
对于数组序列化,PHP 中有 serialize() 和 json_encode()。经过各种基准测试后,我认为 json_encode() 是序列化数组的更快方法,并且对它非常满意。
对于散列,有 md5() 和 sha1() 函数,根据我的基准测试,其中 md5() 更快。
所以我目前的指纹算法是:
$fingerprint=md5(json_encode($array));
Run Code Online (Sandbox Code Playgroud)
但我怀疑这是否是在 PHP 中对数组进行指纹识别的“最快”方法。我尝试过 Google 和 StackOverflow,但还没有找到好的替代品。我是在正确的轨道上还是需要做一些不同的事情?
一旦你得到了你的数组json_encoded,如果你主要关心速度,你可能应该使用非加密哈希函数。不同的哈希函数适用于不同的事情。MD5 和 Sha1 被称为加密,因为它们难以逆转(请注意,由于存在漏洞,它们被广泛认为出于安全目的而被弃用)。CRC(循环冗余校验)函数是错误检测代码,无论如何都不适合唯一性。
维基百科是一个不错的起点,因为那里的贡献通常有指向库实现的外部链接:哈希函数列表。我建议阅读那里的一些非加密库并对其进行基准测试。非加密函数的编写更多是为了速度和合理程度的唯一性,牺牲安全性、错误检测和其他有趣的属性,从您的描述来看,这正是您想要的。
如果您主要关心速度,需要考虑的最后一个注意事项是您将如何存储和比较指纹本身。MD5 输出 128 位数据,如果没有一些额外的库调用和开销,将无法放入 php 中的数字类型。以我的钱,我敢打赌,您可以获得最佳的比较速度,存储将来自可以直接输出 64 位数字的散列函数。请注意,要在 php 中本地获取 64 位数字,您需要拥有 64 位硬件并在 64 位模式下配置/安装 php。我有一些代码在这里的某个地方用于测试我们的登台和生产环境,如果您有兴趣,我可能会挖掘。
顺便说一句,我认为您不会比 json-encode 更快地对数组进行字符串化。该问题的核心是数组遍历和字符串操作,因此速度基本上与输出的详细程度成正比。与 php 的序列化或导出函数相比,JSON 编码非常简洁。我敢打赌,如果您在 php 文档页面上查看了足够多的评论,您会发现有人编写了一个直接将数组作为输入的散列函数,但这是否有任何好处将是一场赌博。
如果我有什么不清楚的地方,请随时提问。