如何在Java中获取Sql Server nvarchar(255)字符串字节以复现MD5哈希算法
解决Java复现SQL Server HashBytes(MD5)(针对nvarchar类型)的问题
我正好处理过类似的需求,核心关键点在于搞清楚SQL Server对nvarchar类型字符串的编码方式——SQL Server的nvarchar采用UTF-16小端序(UTF-16LE)编码,这也是HashBytes计算哈希时使用的字节来源。不需要通过数据库查询,直接在Java里模拟这个编码逻辑就能得到一致的结果。
具体步骤和代码示例
- 获取nvarchar对应的字节数组:在Java中,直接使用
StandardCharsets.UTF_16LE将字符串编码为字节数组,这完全匹配SQL Server处理nvarchar的方式。 - 计算MD5哈希:用Java的
MessageDigest类计算MD5哈希,再转为十六进制字符串(和SQL Server的输出格式对齐)。
完整代码如下:
import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HexFormat; public class SqlServerNvarcharMd5 { public static void main(String[] args) throws NoSuchAlgorithmException { // 待哈希的测试字符串(注意SQL Server里要加N前缀表示nvarchar,Java里直接写字符串即可) String inputString = "HelloWorld测试"; // 1. 转换为SQL Server nvarchar对应的UTF-16LE字节数组 byte[] nvarcharBytes = inputString.getBytes(StandardCharsets.UTF_16LE); // 2. 计算MD5哈希 MessageDigest md5Digest = MessageDigest.getInstance("MD5"); byte[] hashResult = md5Digest.digest(nvarcharBytes); // 3. 转为大写十六进制字符串(和SQL Server的CONVERT(VARCHAR(32), HashBytes(...), 2)输出一致) String hashHex = HexFormat.of().formatHex(hashResult).toUpperCase(); System.out.println("Java计算的MD5哈希: " + hashHex); // 对应SQL语句:SELECT CONVERT(VARCHAR(32), HashBytes('MD5', N'HelloWorld测试'), 2) // 执行后得到的结果应该和Java输出完全相同 } }
验证一致性
比如输入字符串N'Test123':
- SQL Server执行:
SELECT CONVERT(VARCHAR(32), HashBytes('MD5', N'Test123'), 2),得到78E731027D8FD50ED642340B7C9A63B3 - Java代码输入
"Test123",输出的哈希值会完全一致。
注意事项
nvarchar(255)只是长度限制,只要你的输入字符串长度不超过255,编码逻辑和普通nvarchar完全一样,不需要额外处理长度。- 如果字符串包含非ASCII字符(比如中文、特殊符号),UTF-16LE编码会正确处理,保证和SQL Server的字节数组一致。
内容的提问来源于stack exchange,提问作者Stoopkid
相关产品推荐
相关产品推荐

