我正在构建一个Web应用程序,可以动态生成报告(基于从SQL数据库中检索的信息)。这些报告将包含图表,这些图表也可以即时生成。由于这些图表包含敏感信息,因此使用第三方图表API(即:Google图表)是不可能的。
我正在使用PHP的GD扩展来生成这些图表。这很慢。缓存是要走的路,但问题是有大量可能的图表;虽然我相信所要求的大部分图表都是之前生成的图表。
使用数据和其他信息(大小,图表类型等)生成图表。因为这些可以唯一地标识图表,所以我根据此信息为每个图表提供唯一的哈希并保存。现在我可以为新请求的图表计算哈希,看看我是否已经渲染了它。
这个问题是碰撞事件。为了解决这个问题,我正在考虑在SQL表中保存哈希和数据的序列化形式。然后,如果我有缓存命中,我仍然会比较数据本身。
我过度设计了这个? (这是一个160位散列 - SHA1)
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
最有可能的是,如果散列数据长度小于160位,那么您就是安全的。否则,就像你说的那样,可能会发生冲突并且需要比较数据。
答案 1 :(得分:0)
看看ChartDirector我们在工作中使用它并且它不依赖于GD库,应该更快。
答案 2 :(得分:0)
我正在使用PHP的GD扩展来生成这些图表。这很慢。
我怀疑它不是GD的慢点。最可能的候选者是处理整理数据(来自数据库?)。在这种情况下,您可以从优化数据库模式/和/或使用预合并数据中获得显着的好处。
虽然您也可以考虑缓存查询输出,但除非您在其他地方使用相同的数据,否则缓存图形图像可能更简单。
这个问题是发生碰撞事件。
过早优化 - 它不会发生。但是,如果你真的必须,拆分你用来生成图形的元数据并将其存储在一个单独的文件中(再次通过相同的哈希索引) - 然后在运行时进行比较。如果你碰巧遇到了碰撞,我们就会有一个鞭子来给你买一杯饮料。
我建议看一下jpgraph - 这是一个很好的软件,内置缓存。
下进行。