是否存在T-SQL的等价物';Java中的s哈希字节(';SHA1';,VARBINARY(MAX))?

是否存在T-SQL的等价物';Java中的s哈希字节(';SHA1';,VARBINARY(MAX))?,java,hash,byte,varbinary,hashbytes,Java,Hash,Byte,Varbinary,Hashbytes,我正在使用org.apache.commons.codec.digest.DigestUtils库计算Java中的SHA1哈希。 DigestUtils.sha1Hex(“0x808204E039EFB76D96D3780BB507674”) 不幸的是,这不会给出与下面的SQL语句相同的结果 select HASHBYTES('SHA1', CONVERT(VARBINARY(MAX), 0x808204E039EFB76D96D3780BB507674,1)) 在Java中,varbinar

我正在使用org.apache.commons.codec.digest.DigestUtils库计算Java中的SHA1哈希。
DigestUtils.sha1Hex(“0x808204E039EFB76D96D3780BB507674”)

不幸的是,这不会给出与下面的SQL语句相同的结果

select HASHBYTES('SHA1', CONVERT(VARBINARY(MAX),
0x808204E039EFB76D96D3780BB507674,1))
在Java中,varbinary的等价物是byte[]。因此,我尝试了
DigestUtils.sha1Hex(“0x808204E039EFB76D96D3780BB507674.getBytes())
,但这也没有帮助。请指导。

不要使用
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.
}
“Hex”是十六进制或基数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.
}