Я имею MemoryStream, содержащий байты закодированного PNG изображения, и хочу проверить, существует ли точный дубликат тех данных изображения в каталоге на диске. Первый очевидный шаг должен только искать файлы, которые соответствуют точной длине, но после этого я хотел бы знать то, что является самым эффективным способом сравнить память с файлами. Я не очень опытная работа с потоками.
У меня была пара мыслей о вопросе:
Во-первых, если бы я мог бы получить хэш-код для файла, (по-видимому), было бы более эффективно сравнить хэш-коды, а не каждый байт изображения. Точно так же я мог сравнить просто некоторые байты изображения, дав "достаточно близко" ответ.
И затем конечно, я мог просто сравнить весь поток, но я не знаю, как быстрый, который был бы.
Что лучший способ состоит в том, чтобы сравнить MemoryStream с файлом? Байт байтом в для цикла?
Во-первых, получение хэш-кода двух потоков не поможет - чтобы вычислить хэш-коды, вам нужно будет прочитать все содержимое и выполнить некоторые простые вычисления во время чтения. Если вы сравниваете файлы побайтово или с использованием буферов, вы можете остановиться раньше (после того, как найдете первые два байта / блока), которые не совпадают.
Однако этот подход имел бы смысл, если бы вам нужно было сравнить MemoryStream
с несколькими файлами, потому что тогда вам нужно было бы пройти через MemoryStream
только один раз (чтобы вычислить hashcode) и перебрать все файлы.
В любом случае вам придется написать код для чтения всего файла. Как вы упомянули, это можно сделать побайтово или с помощью буферов. Чтение данных в буфер - хорошая идея, потому что это может быть более эффективной операцией при чтении с жесткого диска (например, чтение буфера размером 1 КБ). Более того, вы можете использовать асинхронный метод BeginRead
, если вам нужно обрабатывать несколько файлов параллельно.
Сводка :
Выполнить вышеуказанные шаги асинхронно, используя BeginRead
, если вам нужно обрабатывать несколько файлов параллельно.