Вероятностная проверка файла - алгоритм или библиотеки? - PullRequest
1 голос
/ 23 ноября 2008

Я ищу эффективное средство для частичной проверки целостности «больших» наборов данных на медленной среде передачи. Это кажется распространенной проблемой, поскольку размеры файлов увеличиваются пропорционально скорости передачи.

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

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

Использование "история":
- Данные хранятся в больших зашифрованных контейнерах (размеры 1 ТБ .. 1 ГБ).
- Резервное копирование каждого контейнера выполняется на нескольких дисках в разных местах.
- Проверка должна выполняться без знания основных данных или ключей.

Какие режимы отказа подход должен обнаруживать:
- Сбои транспорта хранения (например, контроллер отбрасывает части физического адреса) - Ошибки сектора (данные для определенного блока не возвращаются)
- Однобитовые ошибки (не-ECC память или кеши)

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

Поскольку целью является целостность данных, методы из сетей с общим доступом к файлам кажутся неприменимыми - для «хеш-дерева» требуется полное хранение хешей на каждом узле, что, по-видимому, требует больше памяти, чем необходимо для сценарии без активных злоумышленников.

  • Как определить соотношение между объемом памяти и временем для чтения соответствующих блоков файла?
  • Если наилучшим способом является хэш-дерево / хэш-список, насколько безопасно хранить частичные значения хешей?
  • Может быть, лучше использовать контрольную сумму или код с исправлением ошибок, чем хэши для эквивалентной защиты?

Ответы [ 3 ]

2 голосов
/ 23 ноября 2008

Передача происходит через USB2, верно? Поэтому вы должны знать, что:

  • Связь USB осуществляется в виде пакетов с полезной нагрузкой до 1024 байтов для высокоскоростной передачи и 16-битным CRC.
  • Каждый пакет подтвержден и потенциально передан.

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

Вы можете начать с Википедии: http://en.wikipedia.org/wiki/USB2 и http://en.wikipedia.org/wiki/Cyclic_redundancy_check.

1 голос
/ 24 ноября 2008

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

0 голосов
/ 23 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...