鉴于以下可能性,最有效的ETag生成是什么?

时间:2013-02-17 14:01:26

标签: http caching http-headers go

我一直在为Go缓存http响应而烦恼,我正试图找出最有效的方法来生成适当的ETag。

现在我有以下数据:

  1. 我在呈现模板时呈现的模板名称。
  2. 将动态数据传递给json响应的模板或响应。
  3. 整个回复机构。
  4. 身体的长度。
  5. 我可能遗失的东西?
  6. 经过一番思考后,我得出的结论是,如果我将模板的名称与生成的动态数据结合起来,理论上应该创造一个合法的独特ETag,其开销最小,但我不知道这有多讨厌如果我开始想要返回30kb的html值数据库结果,我会得到。

    我正在使用Go的stdlib中的crc32例程从我传入的数据中生成ETag。

    有没有更好的方法来生成ETag,甚至缓存动态数据?我不能只监视文件的上次修改时间,因为数据可以在没有文件更改的情况下更改。

2 个答案:

答案 0 :(得分:1)

通常,您希望使用便宜的东西来计算ETag。这样做的原因是,如果客户端发送条件请求(例如,通过If-None-Match HTTP请求标头),您可以决定是否适合发送304 Not Modified响应,而无需进行所有处理对于页面。

例如,如果您有一个页面内容的某种修订标识符,那么这可能会成为一个好的ETag。

如果您需要完成渲染页面所需的所有工作以生成ETag,那么您也可以只使用渲染页面内容的哈希值,或者根本不使用ETag。

答案 1 :(得分:0)

如果您正在寻找一种有效的ETag机制并且不需要加密强大的东西,我建议使用CRC-32。为了帮助防止冲突,您可以组合一些内容,例如模板名称,数据长度和crc:

func etag(name string, data []byte) string {
    crc := crc32.ChecksumIEEE(data)
    return fmt.Sprintf(`W/"%s-%d-%08X"`, name, len(data), crc)
}

This会产生类似W/"tpl-17-3074C885"的电子邮件。