SHA-1 имеет размер блока 64 байта, поэтому его кратность, вероятно, лучше;в противном случае реализация должна будет скопировать частичные блоки в буферы.
Работаете ли вы на многоядерном компьютере?Вы можете запустить распаковку zlib и хеширование SHA-1 в отдельных потоках, используя что-то вроде java.util.concurrent.SynchronousQueue
для передачи каждого распакованного 64-байтового блока из одного потока в другой.Таким образом, вы можете иметь одно ядро, хэширующее один блок, в то время как другое ядро распаковывает следующий блок.
(Вы можете попробовать одну из других реализаций BlockingQueue
, которая имеет некоторую емкость хранилища, но я не думаю, что этоЭто очень помогло бы. Распаковка выполняется намного быстрее, чем хеширование, поэтому поток zlib быстро заполнил бы очередь, а затем ему пришлось бы ждать, чтобы поместить каждый новый блок, точно так же как с SynchronousQueue
.)
Я знаю, что вы сказали, что уже оптимизировали ввод-вывод, но используете ли вы асинхронный ввод-вывод?Для максимальной производительности вы не хотите хэшировать один блок и , а затем попросить ОС прочитать следующий блок, вы хотите, чтобы ОС прочитала следующий блок, а затем хэшируйте тот, который у вас уже есть, покадиск занят загрузкой следующего.Тем не менее, ОС, вероятно, уже выполняет некоторые операции чтения, так что это может не иметь большого значения.
Но помимо всего этого криптографическая хеш-функция - сложная вещь;это просто займет время, чтобы бежать.Может быть, вам нужен более быстрый компьютер.: -)