Надежный и быстрый алгоритм контрольной суммы?

Попробуйте

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
// do some work
}
30
задан Peter Mortensen 24 March 2010 в 21:24
поделиться

9 ответов

Если у Вас есть много маленьких файлов, Ваше узкое место будет файловым вводом-выводом и вероятно не алгоритмом контрольной суммы.

список А хеш-функций (который может считаться контрольной суммой) может быть найден здесь .

там какая-либо причина, которую Вы не можете использовать дату файловой системы, измененную, чтобы определить, изменился ли файл? Это, вероятно, было бы быстрее.

17
ответ дан luke 24 March 2010 в 21:24
поделиться
  • 1
    @DharmeshKheni надеялся, могли ли Вы разъясниться для меня: если бы previousState объявляется, как развернуто, почему он должен был бы развернуть снова в switch для создания этой работы? Спасибо. – Unheilig 27 June 2015 в 06:56

Существует много быстрых алгоритмов CRC, которые должны добиться цели: http://www.google.com/search?hl=en&q=fast+crc&aq=f&oq=

Редактирование: , Почему ненависть? CRC является полностью соответствующим, как свидетельствуется другими ответами. Поиск Google был также соответствующим, так как никакой язык не был определен. Это - старая, старая проблема, которая была решена так много раз, что, вероятно, не будет категорического ответа.

10
ответ дан Mark Ransom 24 March 2010 в 21:24
поделиться
6
ответ дан radu_c 24 March 2010 в 21:24
поделиться
  • 1
    Как Unheilig, я также задаюсь вопросом, почему это явное разворачивание необходимо, когда это было объявлено, как развернуто. Возможно, @mattt может объяснить это нам? – Marius Waldal 25 June 2016 в 09:36

adler32, доступный в zlib заголовках, рекламируется как являющийся значительно быстрее, чем crc32, будучи незначительно менее точным.

4
ответ дан Josh Matthews 24 March 2010 в 21:24
поделиться
  • CRC-32 входит в ум главным образом, потому что дешево вычислить

  • , Любой вид ввода-вывода входит в ум главным образом, потому что это будет ограничивающим фактором для такого обязательства;)

  • проблема не вычисляет контрольные суммы, проблема состоит в том, чтобы заставить изображения в память вычислять контрольную сумму.

  • я предложил бы контроль "stagged":

    • этап 1: проверьте на изменения меток времени файла и если Вы обнаруживаете изменение, там передают...
      (не нужный в Вашем случае, как описано в отредактированной версии)

    • этап 2: получите изображение в память и вычислите контрольную сумму

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

7
ответ дан Peter Mortensen 24 March 2010 в 21:24
поделиться
  • 1
    > You need to add ! < I' d интересоваться слушанием , почему ! необходим как часть этого ответа. – pkamb 19 September 2015 в 19:59

CRC32, вероятно, достаточно хорош, хотя существует маленькое шанс, Вы могли бы получить коллизию, такую, что файл, который был изменен, мог бы быть похожим на него, не был то, потому что эти две версии генерируют ту же контрольную сумму. Для предотвращения этой возможности, я поэтому предложил бы использовать MD5, который легко будет достаточно быстр, и возможности появления коллизии уменьшается до точки, где это - почти бесконечно малая величина.

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

3
ответ дан Bart Read 24 March 2010 в 21:24
поделиться
  • 1
    it' s не точно тот же ответ, чем @DharmeshKheni, потому что it' s не необходимый, чтобы создать временную переменную и развернуть его для решения проблемы. Только необходимо развернуть свойство, которое Вы используете в качестве перечисления. – Ginés SM 19 May 2017 в 14:35

Ваше самое важное требование должно "проверить если измененное содержание".

, Если это самый важный, что ЛЮБОЕ изменение в файле быть обнаруженным, MD-5, SHA-1 или даже SHA-256 должно быть Вашим выбором.

, Учитывая, что Вы указали, что контрольная сумма НЕ быть криптографически хорошим, я рекомендую CRC-32 по трем причинам. CRC-32 дает хорошие расстояния Хемминга по 8K файлу. CRC-32 будет, по крайней мере, порядком величины быстрее, чем MD-5 для вычисления (второе требование). Иногда как важный, CRC-32 только требует, чтобы 32 бита сохранили значение, которое будет сравнено. MD-5 требует 4 раза устройства хранения данных, и SHA-1 требует 5 раз устройства хранения данных.

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

3
ответ дан Epsilon 24 March 2010 в 21:24
поделиться
  • 1
    Переменная не является временной, it' s упрощенный пример. – Sulthan 21 May 2017 в 07:27

Согласно странице Wiki , на которую указывает Luke, MD5 на самом деле быстрее, чем CRC32!

я попробовал это сам при помощи Python 2.6 на Windows Vista и получил тот же результат.

Вот некоторые результаты:

crc32: 162,481544276 Мбайт/с md5: 224,489791549 Мбайт/с

crc32: 168,332996575 Мбайт/с md5: 226,089336532 Мбайт/с

crc32: 155,851515828 Мбайт/с md5: 194,943289532 Мбайт/с

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

2
ответ дан chnrxn 24 March 2010 в 21:24
поделиться
  • 1
    @Sulthan, что это? ... previousState = stateForConversionView switch previousState! { ..., Когда что-то упрощено, когда необходимо записать больше кода? Я видел, что и понял в своей реализации что я don' t должен сделать это. That' s, почему я записал этот ответ. Кроме того, Вы сохраняете ЦП и Память даже когда it' s очень очень мало. – Ginés SM 21 May 2017 в 17:58

Просто приписка к сказанному выше; jpeg использует сжатие с потерями, и степень сжатия может зависеть от программы, используемой для создания jpeg, цветовой палитры и / или битовой глубины в системе, гаммы дисплея, графической карты и установленных пользователем уровней сжатия / настроек цвета. Поэтому сравнение JPEG, созданных на разных компьютерах / платформах или с использованием разного программного обеспечения, будет очень сложно на уровне байтов.

1
ответ дан 27 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: