快速,无冲突哈希算法的路径缓存


fast, collisionless hash algorithm for path caching?

我正在使用php转换网站。我的过程的一部分是验证图像路径不指向不存在的图像(即没有破碎的图像)。由于许多页面共享某些图像,因此我设置了一个缓存数组,以查看是否已经检查了给定路径下是否存在图像文件。

使用原始路径字符串作为数组索引不起作用,所以我使用md5(),这就奏效了。然而,转换脚本需要很长时间,似乎很明显,这是因为md5计算(我在过去的几天里经常运行转换,我马上注意到,一旦我的缓存开始工作,脚本需要更长的时间来运行。)

所以我想知道是否有一个更快的哈希算法,我可以在我的缓存中使用,当然我需要一个不会产生冲突的算法。由于这是一个一次性脚本,我不需要一个超级安全的不可破解的算法,只需要一个可以更快地完成工作的算法。

这个注释显然是php提供给它的所有哈希函数的列表。

Edit我没有在我的评论中引起很多注意,但是当我使用路径的普通字符串作为缓存数组的索引时,它不起作用。只要我把它改为md5哈希,它就工作了。如果我有更多的时间,我会解决这个问题,但这是一个一次性的项目,我不能花更多的时间,除非我绝对必须。

Post Edit好吧,显然我在做一些错误的方式与我的缓存;当我将索引更改为哈希时,我一定改变了一些东西,导致缓存开始工作,而不管哈希是什么。人们说我的散列应该可以处理文件路径字符串,而且md5不会花费那么长时间。所以,我不知道我做错了什么,我没有时间在这个项目中找出它。我想删除这个问题,但是它已经有答案了。

如果这些散列仅在PHP内部使用,并且在此脚本工作时动态构建,为什么不简单地使用数组呢?

if (isset($path_cache['/some/weird/ugly/long/path'])) { 
   ...
}

在没有MD5计算开销的情况下也可以正常工作。

我建议您使用普通路径-不需要散列它。然而,crc32似乎是一个快速的。请记住,你是在牺牲碰撞率来换取速度。

foreach (hash_algos() as $value) {
    print hash($value, 'some random') . ' - ' . $value . '<br />';
}

它将打印在php支持的所有散列算法中散列的字符串

最快的哈希函数似乎是

hash('adler32', $string);

然而,md5()的工作速度几乎和上面的函数一样快。

是PHP中所有可用散列的基准。
http://l.garygolden.me/fastest-hash-php