java - Java中是否有等效于T-SQL的 HASHBYTES('SHA1', VARBINARY(MAX)) ?
问题描述
我正在使用 org.apache.commons.codec.digest.DigestUtils 库来计算 Java 中的 SHA1 哈希。
DigestUtils.sha1Hex("0x808204E039EFB76D96D3780BB507674")
.
不幸的是,这并没有给出与下面的 SQL 语句相同的结果?
select HASHBYTES('SHA1', CONVERT(VARBINARY(MAX),
0x808204E039EFB76D96D3780BB507674,1))
varbinary 的等价物是 Java 中的 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”是十六进制或base 16 的缩写。在base 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.
}
推荐阅读
- syntax - 乔姆斯基层次结构和机器人框架
- youtube - 下载 youtube 数据时出现“YouTube 说:无法提取视频数据”
- javascript - 尝试将 Web 部件文档库的标题覆盖为 URL 中的值 - SharePoint 2016
- amazon-web-services - 除非在特定容量下,否则如何防止创建 DynamoDB 表
- .htaccess - 使用 HTaccess 重定向特定的用户代理
- python - 将向量的每个元素的元素与同一向量的后续元素相除
- ionic-framework - 如何将输入值显示到离子网格?
- python - 很难尝试在 python 中处理异常
- json - 在 sqlalchemy 上执行 json 发布请求时出现键错误
- python - Matplotlib hist() 对二维 numpy 数组输入有什么作用?