Эффективно проверяйте подпись на больших наборах данных с помощью JCA

StackOverflow https://stackoverflow.com/questions/407990

Вопрос

Мне нужно проверить подпись файла, размер которого может достигать 2 ГБ, и я хочу сделать это максимально эффективно с точки зрения использования памяти.По разным причинам файл уже полностью загружен в память, и доступ к нему осуществляется с помощью InputStream по приложению.Я хотел бы проверить подпись, используя интерфейс потока, но JCA Signature сорт' update метод принимает только byte[] и связанные с ним классы.

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

Обновлять

Если это имеет значение, алгоритм подписи — SHA-1.

Это было полезно?

Решение

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

Другие советы

Создайте массив байтов, который будет действовать как буфер и считывать буфер за раз из InputStream, каждый раз вызывая update() для подписи.При условии, что буфер имеет разумный размер, время процессора, затрачиваемое на передачу данных из одного процесса в другой (я предполагаю, что вы делаете именно это?), вероятно, будет незначительным по сравнению со временем вычислений.В случае чтения с диска пределом незначительной отдачи от использования ЦП является размер буфера около 8 КБ, и я подозреваю, что это более или менее применимо и в вашем случае.(Если интересно, посмотрите страницу, которую я собрал на Размеры буфера входного потока.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top