php - 对数组进行指纹识别的最快方法(从数据数组计算唯一哈希值)

标签 php arrays hash fingerprint

我在我的 WWW 框架中使用了大量的 API 调用缓存和缓冲,我最终使用的其中一件事是“指纹识别”数据,以便匹配缓存文件名以及检测具有已经做好了。

很多数据都是在数组中移动的,比如GET、POST等等。因此,API 调用的唯一性取决于数据。

因此我需要对这些信息进行指纹识别。要做到这一点,还需要从数据数组中生成一个“指纹”,并将其散列为一个我可以存储和比较的字符串。

对于数组序列化,PHP 中有 serialize() 和 json_encode()。经过各种基准测试后,我认为 json_encode() 是序列化数组的更快方法,对此我感到非常满意。

对于散列,有 md5() 和 sha1() 函数,根据我的基准测试,其中 md5() 更快。

所以我目前的指纹算法是:

$fingerprint=md5(json_encode($array));

但我怀疑这是否是在 PHP 中对数组进行指纹识别的“最快”方法。我已经尝试过 Google 和 StackOverflow,但还没有找到好的替代品。我是在正确的轨道上还是需要做一些不同的事情?

最佳答案

获得数组 json_encoded 后,如果您主要关心速度,则可能应该使用非密码哈希函数。不同的哈希函数适用于不同的事物。 MD5 和 Sha1 之所以称为密码,是因为它们很难逆转(请注意,由于存在漏洞,出于安全目的,它们被广泛认为已弃用)。 CRC(循环冗余校验)函数是错误检测代码,无论如何都不适合唯一性。

Wikipedia 是一个不错的起点,因为那里的贡献通常有指向库实现的外部链接:List of hash functions .我建议阅读那里的一些非加密库并对它们进行基准测试。非加密函数更多的是为了速度和合理的唯一性程度而编写,牺牲了安全性、错误检测和其他有趣的属性,从你的描述来看,这正是你想要的。

如果您主要关心速度,最后要考虑的一点是您将如何存储和比较指纹本身。 MD5 输出 128 位数据,如果没有一些额外的库调用和开销,这些数据将不适合 php 中的数字类型。为了我的钱,我敢打赌你可以获得最好的比较速度,并且存储将来自可以直接输出 64 位数字的哈希函数。请注意,要在 php 中本地获取 64 个数字,您需要具有 64 位硬件并在 64 位模式下配置/安装 php。我在附近的某处有一些代码,用于测试我们的暂存和生产环境,如果您有兴趣,我可能会挖掘出来。

顺便说一句,我不认为你会得到比 json-encode 更快的数组字符串化。该问题的核心是数组遍历和字符串操作,因此速度基本上与输出的冗长程度成正比。与 php 的序列化或导出功能相比,JSON 编码非常简洁。我敢打赌,如果您在 php 文档页面上浏览了足够多的评论,您会发现有人编写了一个直接将数组作为输入的散列函数,但它是否有任何好处将是一场赌博。

如果我有任何不清楚的地方,请随时提问。

关于php - 对数组进行指纹识别的最快方法(从数据数组计算唯一哈希值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813206/

相关文章:

Java HashMap 哈希函数

php - 未捕获的运行时异常 : Unable to load ZF2 Run `php composer.phar install`

php - 不同浏览器的 Laravel Redis 行为

php - 失败的 MySQL 查询会产生副作用吗?

c - 从 C 文件中读取二维数组

java - 如何使用 Jackson 反序列化数组的数组?

arrays - 对 bash 脚本中的每个文件使用 exec

c - 对于相同的值,double 中的字节散列是否始终相同?

jQuery单页网站滚动/哈希问题

php - 如何在字符串中的某个字符之后按字母顺序对php数组进行排序