编程语言
首页 > 编程语言> > php – 用于对数组进行指纹识别的最快方法(从数据数组中计算唯一的哈希值)

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

作者:互联网

我在我的WWW框架中使用了很多缓存和缓冲API调用,我最终使用的其中一个是“指纹识别”数据,以便匹配缓存文件名以及检测已经进行的API调用.

许多数据都在数组中移动,如GET,POST等.因此,API调用的唯一性取决于数据.

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

对于数组序列化,PHP中有serialize()和json_encode().在各种基准测试之后,我认为json_encode()是一种更快的序列化数组的方法,我很满意它.

对于散列,有md5()和sha1()函数,根据我的基准测试,md5()的速度更快.

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

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

但我怀疑这是否是用于在PHP中对数组进行指纹识别的“最快可能”方法.我曾尝试使用Google和StackOverflow,但没有找到好的替代品.我是在正确的轨道还是我需要做一些与众不同的事情?

解决方法:

一旦你的数组json_encoded,如果你主要关心速度,你应该使用非cyrptographic哈希函数.不同的哈希函数适用于不同的东西. MD5和Sha1被称为加密,因为它们难以逆转(请注意,由于漏洞,它们被广泛认为是出于安全目的而被弃用). CRC(循环冗余校验)功能是错误检测代码,并且无论如何都不适合于唯一性.

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

最后要考虑的是,如果你主要关注速度,那么你将如何存储和比较指纹本身. MD5输出128位数据,如果没有额外的库调用和开销,它将不适合php中的数字类型.对于我的钱,我敢打赌,你可以获得最佳的比较速度,存储将来自一个可以直接输出64位数字的哈希函数.请注意,要在php中本地获取64个数字,您需要拥有64位硬件并在64位模式下配置/安装php.我在这里有一些代码用于测试我们可能在我感兴趣时可能会挖掘的阶段和产品环境.

顺便说一句,我认为你不会得到比json-encode更快的数组字符串化.这个问题的核心是数组行走和字符串操作,因此速度基本上与输出的详细程度成正比.与php的序列化或导出函数相比,JSON编码非常简洁.我敢打赌,如果你在php文档页面上查看了足够多的评论,你会发现有人编写了一个直接将数组作为输入的哈希函数,但是它是否是任何好的都是赌博.

如果我不清楚任何事情,请随时提问.

标签:php,arrays,hash,fingerprint
来源: https://codeday.me/bug/20190902/1790206.html