Эффективный в памяти алгоритм хеширования для больших объемов данных - PullRequest
1 голос
/ 23 апреля 2011

Я использую C # в Windows Mobile 5. Программа загружает большие файлы из Интернета вместе с их значениями хеш-функции.Затем он вычисляет хеш-значение загруженных данных и сравнивает его с ожидаемым хеш-значением.Идея состоит в том, чтобы убедиться, что весь файл был загружен не поврежденным.

Проблема в том, что файл достаточно велик, чтобы, если я помещу все содержимое файла в память в байтовом массиве, устройство будетисчерпать память.Однако я хочу сделать это, чтобы я мог вычислить хэш байтов.Можно ли вычислить хеш, не имея всех байтов в памяти одновременно?Предпочтительно я хотел бы вычислить хэши SHA1, используя класс SHA1Managed, но я готов изменить это при необходимости.Я заметил, что существует перегрузка метода SHA1Managed.ComputeHash (), который принимает поток, но я не знаю, использует ли он меньше памяти, чем просто извлечение всех байтов в память и профилировщики памяти, о которых я знаю.NET CF абсолютно бесполезны.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2011

SHA1Managed.ComputeHash(Stream) должен быть более эффективным при использовании памяти, если вы отбрасываете содержимое потока после вычисления значения хеш-функции.Сколько памяти вы будете использовать, частично будет зависеть от реализации Stream.

1 голос
/ 23 апреля 2011

Вот как это делается на рабочем столе:

Вычислить хэш из потока неизвестной длины в C #

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

...