Как быстро генерировать CRC? - PullRequest
2 голосов
/ 26 октября 2011

Мне нужно создать etags для файлов изображений в Интернете. Одним из возможных решений, о которых я подумал, было бы рассчитать CRC для файлов изображений, а затем использовать их в качестве этаг.

Для этого потребуется вычислять CRC каждый раз, когда кто-то запрашивает изображение на сервере, поэтому очень важно, чтобы это можно было сделать быстро.

Итак, как быстро работают алгоритмы для генерации CRC? Или это глупая идея?

Ответы [ 4 ]

5 голосов
/ 26 октября 2011

Вместо этого используйте более надежный алгоритм хеширования, такой как SHA1 .

Скорость зависит от размера изображения.Большая часть времени будет потрачена на загрузку данных с диска, а не на обработку ЦП.Вы можете кэшировать ваши сгенерированные хэши.

Но я также советую создавать etag на основе даты последнего обновления файла , что намного быстрее и не требует загрузки всего файла.

Помните, что etag должен быть уникальным только для определенного ресурса, поэтому, если два разных изображения имеют одинаковое время последнего обновления, это нормально.

2 голосов
/ 26 октября 2011

В большинстве реализаций в качестве ETag используется дата последнего изменения или другие заголовки файлов, включая собственный Microsoft , и я предлагаю вам использовать этот метод.

1 голос
/ 26 октября 2011

Зависит от используемого метода и длины.Как правило, довольно быстро, но почему бы не кэшировать их?

Если в файлах не будет изменений чаще, чем разрешение системы, используемой для их хранения (то есть времени модификации файла для файловой системы илиSQLServer datetime, если он хранится в базе данных), тогда почему бы просто не использовать дату изменения соответствующего разрешения?

Я знаю, что RFC 2616 не рекомендует использовать временные метки, но это только потому, что временные метки HTTP равны 1сек.разрешение и там могут быть изменения чаще, чем это.Однако:

  1. Это все еще хорошо, если вы не меняете изображения чаще, чем раз в секунду.
  2. Хорошо также основывать свой электронный тег на времени, пока точностьдостаточно велик, чтобы он не заканчивался одинаково для двух версий одного и того же ресурса.

При таком подходе вам гарантирован уникальный электронный тег (коллизии маловероятны с большим CRC, ноконечно, возможно), что вам и нужно.

Конечно, если вы никогда не меняете изображение с заданным URI, это даже проще, так как вы можете просто использовать фиксированную строку (я предпочитаю строку «immutable»«).

1 голос
/ 26 октября 2011

Я бы посоветовал вычислить хеш при добавлении изображения в базу данных один раз, а затем просто вернуть его с помощью SELECT вместе с самим изображением.

Если вы используете Sql Server и изображения не очень большие (макс. 8000 байт), вы можете использовать функцию HASHBYTES () , которая может генерировать SHA-1, MD5, ...

...