我需要在网络上为图像文件生成etags。我想到的一个可能的解决方案是计算图像文件的CRC,然后将它们用作etag。
这将要求每次有人在服务器上请求图像时计算CRC,因此非常重要的是可以快速完成。
那么,生成CRC的算法有多快?或者这是一个愚蠢的想法?
答案 0 :(得分:5)
使用更强大的哈希算法,例如SHA1。
速度取决于图像的大小。大部分时间都花在从磁盘加载数据上,而不是在CPU处理中。您可以缓存生成的哈希值。
但我也建议根据文件的最后更新日期创建etag,这样更快,不需要加载整个文件。
请记住, etag 必须仅对特定资源是唯一的,因此如果两个不同的图像具有相同的上次更新时间,则可以。
答案 1 :(得分:2)
大多数实现使用上次修改日期或其他文件头作为ETag,包括Microsoft's own,我建议您使用该方法。
答案 2 :(得分:1)
我建议在将图像添加到数据库中时计算哈希值,然后通过SELECT将其与图像本身一起返回。
如果您使用Sql Server并且图像不是很大(最多8000字节),您可以利用能够生成SHA-1,MD5,...的HASHBYTES()函数。
答案 3 :(得分:1)
取决于使用的方法和长度。通常很快,但为什么不缓存它们?
如果文件的更改频率不会超过用于存储文件的系统的分辨率(即文件系统的文件修改时间或SQLServer日期时间,如果存储在数据库中),那么为什么不呢?只需使用相关决议的修改日期?
我知道RFC 2616建议不要使用时间戳,但这只是因为HTTP时间戳是1秒分辨率,并且可能会有更频繁的变化。但是:
通过这种方法,您可以保证获得一个独特的电子标签(无法通过大型CRC进行碰撞,但肯定是可能的),这就是您想要的。
当然,如果你没有在给定的URI上更改图像,那就更容易了,因为你可以使用一个固定的字符串(我更喜欢字符串“immutable”)。