Перво-наперво: скорость переоценена.Вы должны принять меры, прежде чем объявить, что данный алгоритм «слишком медленный».В большинстве случаев скорость хеш-функции не имеет никакого значения.Если вы сомневаетесь в безопасности, то сначала выберите хеш-функцию, которая достаточно безопасна, а затем беспокоитесь только о производительности.
Более того, вы хотите хешировать «строки».Java String
внутренне является порцией из массива char
значений, которые представляют кодовые точки Unicode (фактически, 16-битные кодовые единицы Unicode, которые кодируют кодовые точки с использованием UTF-16).Хеш-функция принимает в качестве входных данных последовательность битов или байтов.Таким образом, вам нужно будет выполнить шаг преобразования, например, str.getBytes("UTF-8")
, чтобы получить строку в виде байтов.Вполне вероятно, что шаг преобразования будет иметь незначительную стоимость по сравнению с самим хэшированием.
Примечание: остерегайтесь кодировки URL!В URL некоторые байты могут быть заменены последовательностями, начинающимися со знака «%
»;это предназначено для поддержки непечатаемых символов, но может использоваться и для «стандартных» символов (например, замена 'a
' на '%61
').Это означает, что две строки, которые различны (в смысле String.equals()
), могут фактически представлять один и тот же URL (что касается обработки URL).В зависимости от вашей ситуации это может или не может быть проблемой.
Сначала вы должны попытаться использовать Java MessageDigest
API со стандартным (уже установленным) поставщиком JCE (т.е. вы звоните MessageDigest.getInstance("SHA-256")
), исравнить результат.Теоретически, JCE может сопоставить вызов реализации с "собственным" кодом (написанным на C или сборке), который будет быстрее, чем то, что вы можете получить с помощью Java.
При этом ...
sphlib - это реализация многих криптографических хеш-функций с открытым исходным кодом на C и Java.Код был оптимизирован для скорости, и на практике версия Java оказывается быстрее, чем стандартная JRE от Sun / Oracle.Используйте эту ссылку в случае сбоя предыдущей ссылки (главный хост-сервер иногда не работает из-за технического обслуживания, как это, похоже, происходит сейчас) (предупреждение: загрузка 10 МБ).В архиве также содержится отчет (который был представлен на второй конференции кандидатов SHA-3 в 2010 году), в котором приведены некоторые измеренные показатели производительности на нескольких платформах для SHA-2 и 14 кандидатов во «второй раунд» дляпредстоящий SHA-3.
Но вы действительно должны сделать тесты на месте.Например, влияние на кэш L1 может сильно повлиять на производительность и не может быть точно предсказано, если взять код функции и запустить его изолированно.