Php 图像缓存策略 情景

Php 图像缓存策略 情景,php,caching,hash-collision,Php,Caching,Hash Collision,我正在构建一个web应用程序,其中可以根据从SQL数据库检索到的信息动态生成报告。这些报告将包含图表,这些图表也可以动态生成。因为这些图表包含敏感信息,所以使用第三方图表API(即:Google charts)是不可能的 问题 我正在使用PHP的GD扩展生成这些图表。它相当慢。缓存是一种方式,但问题是有大量可能的图表;虽然我相信大多数要求的图表都是以前生成的 部分解 图表是使用数据和其他信息大小、图表类型等生成的。。因为这些可以唯一地标识一个图表,所以我根据这些信息给每个图表一个唯一的哈希,并保

我正在构建一个web应用程序,其中可以根据从SQL数据库检索到的信息动态生成报告。这些报告将包含图表,这些图表也可以动态生成。因为这些图表包含敏感信息,所以使用第三方图表API(即:Google charts)是不可能的

问题 我正在使用PHP的GD扩展生成这些图表。它相当慢。缓存是一种方式,但问题是有大量可能的图表;虽然我相信大多数要求的图表都是以前生成的

部分解 图表是使用数据和其他信息大小、图表类型等生成的。。因为这些可以唯一地标识一个图表,所以我根据这些信息给每个图表一个唯一的哈希,并保存它。现在,我可以计算一个新请求的图表的哈希值,看看是否已经呈现了它

问题是发生了碰撞。为了解决这个问题,我考虑将散列和数据的序列化形式保存在SQL表中。如果缓存命中,我仍然会比较数据本身

我设计得太过火了?这是一个160位的hash-SHA1
是否有更好的方法来处理此问题?

如果哈希数据长度小于160位,则很可能是安全的。否则,正如您所说,可能会发生冲突,比较数据是必要的

看看我们在工作中使用它,它不依赖GD库,应该更快

我正在使用PHP的GD扩展生成这些图表。它相当慢

我怀疑这不是GD,这是缓慢的一点。最有可能的候选者是从数据库中整理数据的过程?。在这种情况下,您可以从优化数据库模式和/或使用预整合数据中获得显著的好处

尽管你也可以考虑缓存查询输出,但是除非你在别处使用相同的数据,否则缓存图形图像可能会更简单。 问题是发生了碰撞

过早优化-这不会发生。但是,如果您真的必须这样做,请分割用于生成图形的元数据,并将其存储在一个单独的文件中,再次通过相同的哈希索引,然后在运行时进行比较。如果你设法撞车,我们会找人来请你喝一杯

我建议大家看看jpgraph,它是一款优秀的软件,内置了缓存功能


C.

与160位哈希冲突的概率为1.461502×10^48:1。你需要大量的报告或大量的厄运才能在那里发生碰撞为了避免GD的内部结构,您在这里看过了吗@deceze它实际上更接近1.21x10^24生日悖论,但我认为这是一个相当大的数字:@Palantir它仍然基于GD,许可是一个问题。。。谢谢你,这些该死的悖论一直在困扰着我。尽管如此,仍有大量报告有待传阅我测量了运行时间;从数据库获取和处理数据的速度要快好几个数量级,比生成图像快约200倍。