Есть ли эквивалент HASHBYTES ('SHA1', VARBINARY (MAX)) T- SQL в Java? - PullRequest
0 голосов
/ 19 июня 2020

Я использую библиотеку org. apache .commons.code c .digest.DigestUtils для вычисления SHA1 ha sh в Java. DigestUtils.sha1Hex("0x808204E039EFB76D96D3780BB507674").

К сожалению, это не дает того же результата, что и приведенная ниже инструкция SQL?

select HASHBYTES('SHA1', CONVERT(VARBINARY(MAX),
0x808204E039EFB76D96D3780BB507674,1))

Эквивалент varbinary - byte [] в Java. Итак, я попробовал DigestUtils.sha1Hex("0x808204E039EFB76D96D3780BB507674".getBytes()), но это тоже не помогло. Пожалуйста, направьте.

1 Ответ

1 голос
/ 20 июня 2020

Не используйте getBytes(). Это не имеет ничего общего с декодированием шестнадцатеричных значений.

getBytes () возвращает один или несколько байтов для каждого символа в строке, используя кодировку базовой системы по умолчанию. Эта кодировка почти наверняка является либо UTF-8, либо windows -125x, что означает, что все символы в вашей строке будут иметь один соответствующий байт из-за того, как эти кодировки преобразуют символы в байты и из них.

Итак, ваш массив байтов будет иметь такие значения, что определенно не то, что вы хотите:

{
    56, // codepoint for the '8' character
    48, // codepoint for the '0' character
    56, // codepoint for the '8' character
    50, // codepoint for the '2' character
    48, // codepoint for the '0' character
    52, // codepoint for the '4' character
    69, // codepoint for the 'E' character
    // etc.
}

«Шестнадцатеричный» - это сокращение от шестнадцатеричного числа или основания 16. В базе 16, две цифры представляют байтовое значение, то есть значение от 0 до 2⁸ − 1. Вам нужно преобразовать каждые две цифры в однобайтовое значение.

Хотя для этого есть сторонние утилиты, это настолько просто, что вам действительно лучше сделать это вручную:

String s = "0x808204E039EFB76D96D3780BB507674";

// chop off "0x"
s = s.substring(2);

byte[] bytes = new BigInteger(s, 16).toByteArray();

Теперь массив байтов будет иметь значения, которые соответствуют байтам, представленным вашими шестнадцатеричными цифрами:

{
    8,      // 0x8
    8,      // 0x08
    32,     // 0x20
    78,     // 0x4E
    3,      // 0x03
    -98,    // 0x9E
    // etc.
}
...