CRC产生的速度有多快?

时间:2011-10-26 11:16:23

标签: c# crc

我需要在网络上为图像文件生成etags。我想到的一个可能的解决方案是计算图像文件的CRC,然后将它们用作etag。

这将要求每次有人在服务器上请求图像时计算CRC,因此非常重要的是可以快速完成。

那么,生成CRC的算法有多快?或者这是一个愚蠢的想法?

4 个答案:

答案 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秒分辨率,并且可能会有更频繁的变化。但是:

  1. 如果你不每秒更换一次图像,那仍然没问题。
  2. 只要精度足够高,并且对于同一资源的两个版本不会达到相同的效果,那么将电子标签建立在时间上也是可以的。
  3. 通过这种方法,您可以保证获得一个独特的电子标签(无法通过大型CRC进行碰撞,但肯定是可能的),这就是您想要的。

    当然,如果你没有在给定的URI上更改图像,那就更容易了,因为你可以使用一个固定的字符串(我更喜欢字符串“immutable”)。