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

如何在Java中生成与C语言生成结果匹配的SHA1密钥?

Java实现与C语言SHA1哈希一致的方案

没问题,我来帮你搞定这个跨语言SHA1哈希结果一致的问题!先给你划个关键细节:你提供的C代码里,sizeof(data)会把字符串末尾的**空字符\0**也算进哈希的输入长度里,这是很多人踩坑的地方,必须在Java里模拟这个输入才能得到相同结果。

核心实现要点

  • 模拟C语言的输入:在Java字符串末尾手动添加\0,因为C里的char[]会自动补这个结束符,sizeof()会把它算入哈希长度
  • 统一编码标准:C语言的字符串默认是ASCII编码,Java里要指定US-ASCII编码获取字节数组,避免不同平台默认编码差异
  • 使用Java标准库生成哈希:借助MessageDigest类实现SHA1算法,和C语言的SHA1()函数逻辑对齐

完整代码示例

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA1Matcher {
    public static void main(String[] args) {
        try {
            // 完全复刻C代码的输入:原字符串 + 末尾的空字符\0
            String input = "Hello, world!" + "\0";
            // 用US-ASCII编码获取字节数组,和C语言的char[]编码逻辑一致
            byte[] data = input.getBytes("US-ASCII");

            // 初始化SHA1消息摘要器
            MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");
            // 生成20字节的SHA1哈希结果
            byte[] hashBytes = sha1Digest.digest(data);

            // 可选:把哈希字节转换成十六进制字符串,方便和C代码的结果对比
            StringBuilder hexHash = new StringBuilder();
            for (byte b : hashBytes) {
                // 确保每个字节都转换成两位十六进制字符
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexHash.append('0');
                }
                hexHash.append(hex);
            }

            System.out.println("SHA1哈希(十六进制):" + hexHash.toString());
        } catch (NoSuchAlgorithmException e) {
            System.err.println("SHA1算法不支持?这情况几乎不可能出现!");
            e.printStackTrace();
        } catch (java.io.UnsupportedEncodingException e) {
            System.err.println("US-ASCII编码不支持?这也太离谱了!");
            e.printStackTrace();
        }
    }
}

一致性验证建议

你可以把C代码生成的hash数组转换成十六进制字符串,和Java输出的结果对比,完全一致就说明实现正确了。如果之前结果不一致,大概率是没加\0或者编码不统一导致的。

内容的提问来源于stack exchange,提问作者Deb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:32:30