Советы по максимальной производительности хеширования SHA-1 на Java - PullRequest
5 голосов
/ 15 марта 2012

Я пишу библиотеку Java, которая должна вычислять хэши SHA-1. Во время обычной задачи JVM тратит около 70% своего времени на sun.security.provider.SHA.implCompress, 10% на java.util.zip.Inflater.inflate и 2% на sun.security.provider.ByteArrayAccess.b2iBig64. (По данным профилировщика NetBeans.)

Не получается правильно подобрать ключевые слова для поиска Google для получения релевантных результатов. Я не очень знаком с алгоритмом хеширования SHA-1. Как я могу получить максимальную производительность от SHA-1 MessageDigest? Есть ли определенный размер куска, который я должен переваривать, или несколько определенных размеров, которые я должен попробовать?

Чтобы ответить на некоторые вопросы, о которых вы думаете:

  • Да, я перевариваю, когда читаю файлы (MessageDigest.update), поэтому байты перевариваются только один раз.
  • Дайджесты SHA-1 используются в качестве контрольных сумм, обычно для файлов, которые должны быть zlib / накачаны.
  • Нет, я не могу использовать другой хеш.
  • Да, я знаю, что zlib уже использует контрольные суммы, но внешние требования определяют использование хэшей SHA-1 поверх этого. Я не могу придумать вескую причину, почему (+1, если можете): -)

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Может быть, вы можете обратиться к нативному коду, написанному на C. Должно быть множество супер оптимизированных библиотек SHA1.

1 голос
/ 15 марта 2012

SHA-1 имеет размер блока 64 байта, поэтому его кратность, вероятно, лучше;в противном случае реализация должна будет скопировать частичные блоки в буферы.

Работаете ли вы на многоядерном компьютере?Вы можете запустить распаковку zlib и хеширование SHA-1 в отдельных потоках, используя что-то вроде java.util.concurrent.SynchronousQueue для передачи каждого распакованного 64-байтового блока из одного потока в другой.Таким образом, вы можете иметь одно ядро, хэширующее один блок, в то время как другое ядро ​​распаковывает следующий блок.

(Вы можете попробовать одну из других реализаций BlockingQueue, которая имеет некоторую емкость хранилища, но я не думаю, что этоЭто очень помогло бы. Распаковка выполняется намного быстрее, чем хеширование, поэтому поток zlib быстро заполнил бы очередь, а затем ему пришлось бы ждать, чтобы поместить каждый новый блок, точно так же как с SynchronousQueue.)

Я знаю, что вы сказали, что уже оптимизировали ввод-вывод, но используете ли вы асинхронный ввод-вывод?Для максимальной производительности вы не хотите хэшировать один блок и , а затем попросить ОС прочитать следующий блок, вы хотите, чтобы ОС прочитала следующий блок, а затем хэшируйте тот, который у вас уже есть, покадиск занят загрузкой следующего.Тем не менее, ОС, вероятно, уже выполняет некоторые операции чтения, так что это может не иметь большого значения.

Но помимо всего этого криптографическая хеш-функция - сложная вещь;это просто займет время, чтобы бежать.Может быть, вам нужен более быстрый компьютер.: -)

0 голосов
/ 15 марта 2012

Вы пробовали переключить обработку файлов на файл с отображением в памяти? Производительность для них, как правило, значительно выше, чем у обычных IO и NIO.

...