Вопрос по c – Можно ли разбить md5 на несколько ядер / потоков?

11

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

Мое элементарное понимание md5 состоит в том, что весь процесс является полностью линейным, где значения зависят от всех прочитанных предыдущих значений, и мы ничего не можем сделать, чтобы сделать его многопоточным. Это правда?

Или есть способ разбить файлы на разделы, рассчитать<something> над несколькими частями, используя многоядерные, а затем объединить те<something> значения в финал md5?

Библиотека, которую мы используем для вычисления md5sum:http://libmd5-rfc.sourceforge.net/ но я бы переключился на другой, если бы можно было разбить сумму md5 на несколько ядер, чтобы она выполнялась быстрее.

(Примечание: переход на что-то отличное от md5 не является вопросом, и при этом это не может быть сделано из-за других закрытых систем, с которыми это взаимодействует. Также это не вопрос безопасности использования md5.)

Вы гуглили за это? Один из первых хитов для «параллельной реализации MD5» является:wwwcip.cs.fau.de/~spjsschl/md5.pdf, который, кажется, показывает, что короткий ответ - «Да, это возможно». Jerry Coffin
@JerryCoffin Я думаю, что эта статья немного вводит в заблуждение. Я понял, что они распараллеливали несколько итераций MD5 для хеширования паролей, а не сам алгоритм MD5. Другая их оптимизация состояла в том, чтобы использовать один большой 128-битный регистр SSE вместо 4 32-битных регистров. greg
+1 за вашу "заметку". Хотя тот факт, что вы знаете о проблемах, подразумевает, что, возможно, вам следует подумать о том, чтобы что-то с ними сделать ... Ben
конвейерная обработка также распараллеливание. MD5 выполняет 64 раунда, и эти раунды могут быть конвейерными. Это то, что они сделали. jthill
Прочитайте эту статью, и в основном они ничего не сделали для многопоточных вычислений MD5 на одном входе. Их многопоточность предназначена только для одновременного вычисления нескольких хешей MD5, что будет полезно только для операции, если у него есть более одного большого файла для хеширования. Они подытожили это в разделе 3.2: «Поскольку между каждым шагом MD5 существует неснимаемая зависимость от данных, невозможно ускорить время выполнения одной итерации». billc.cn

Ваш Ответ

1   ответ
9

Нет, вы не можете разбить его на файловом уровне. MD5 поддерживает состояние при прохождении через данные.

Похожие вопросы