You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中获取Sql Server nvarchar(255)字符串字节以复现MD5哈希算法

解决Java复现SQL Server HashBytes(MD5)(针对nvarchar类型)的问题

我正好处理过类似的需求,核心关键点在于搞清楚SQL Server对nvarchar类型字符串的编码方式——SQL Server的nvarchar采用UTF-16小端序(UTF-16LE)编码,这也是HashBytes计算哈希时使用的字节来源。不需要通过数据库查询,直接在Java里模拟这个编码逻辑就能得到一致的结果。

具体步骤和代码示例

  1. 获取nvarchar对应的字节数组:在Java中,直接使用StandardCharsets.UTF_16LE将字符串编码为字节数组,这完全匹配SQL Server处理nvarchar的方式。
  2. 计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:26:05