В вашем коде есть несколько странных вещей.
Кодировка UTF-8 символа может использовать более одного байта. Поэтому вам не следует использовать длину string в качестве конечного параметра для вызова update()
, но длину массива байтов, который getBytes()
фактически вернул. Как предложил Paŭlo, используйте метод update()
, который принимает в качестве параметра один byte[]
.
Вывод MD5 представляет собой последовательность из 16 байтов с совершенно произвольными значениями. Если вы интерпретируете его как целое число (это то, что вы делаете со своим вызовом BigInteger()
), тогда вы получите числовое значение, которое будет меньше 2 160 , возможно, намного меньше. При преобразовании обратно в шестнадцатеричные цифры вы можете получить 32, 31, 30 ... или менее 30 символов. Вы используете строку слева в формате "%032X"
с достаточным количеством нулей, так что ваш код работает, но он является косвенным (вывод MD5 никогда не был целым числом с самого начала).
Вы собираете элементы ввода хэша с необработанной конкатенацией. Это может вызвать проблемы. Например, если modeName
равен "foo
", а modeParentName
равен "barqux
", то ввод MD5 начнется с (кодировка UTF-8) "foobarqux
". Если modeName
равен "foobar
", а modeParentName
равен "qux
", то вход MD5 будет также начинаться с "foobarqux
". Вы не говорите, почему вы хотите использовать хеш-функцию, но обычно, когда кто-то использует хеш-функцию, она должна иметь уникальный след некоторого фрагмента данных; два разных элемента данных должны давать разные входные данные хеш-функции.
При обработке nodeValue
вы вызываете trim()
, что означает, что эта строка может начинаться и / или заканчиваться пробелом, и вы не хотите включать этот пробел в хэш-ввод - но вы делаете включите его, так как вы добавляете nodeValue
, а не nodeValue.trim()
.
Если то, что вы пытаетесь сделать, имеет какое-либо отношение к безопасности, то вам не следует использовать MD5, который криптографически нарушен. Вместо этого используйте SHA-256.
Хэширование XML-элемента обычно выполняется посредством канонизации (которая обрабатывает пробелы, порядок атрибутов, представление текста и т. Д.). См. этот вопрос по теме канонизации данных XML с помощью Java.