java - 如何在Java中获取未签名的md5哈希值

标签 java md5

我正在使用 C# Web 服务,参数之一是发送 md5 哈希值。 Java 创建带符号的 MD5 哈希(字节数组中包含负数),C# 生成无符号的 MD5 哈希(字节数组中不包含负数)。

我在 Stack Overflow 上浏览过多个类似的问题,但没有找到令我满意的问题。

我所需要的只是类似于 c# 生成的无符号字节数组。我尝试过使用 BigInteger,但我需要将其放在无符号字节数组中,因为之后我需要进行进一步处理。 BigInteger 给我一个整数,使用 tobytearray() 仍然有负数。

如果我必须做 2 补,那么我该怎么做。然后我可以循环遍历字节数组并将负数转换为正数。

我使用以下 Java 代码来生成 MD5 哈希值:

    String text = "abc";
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5hash = new byte[32];
    try {
        md.update(text.getBytes("utf-8"), 0, text.length());
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    md5hash = md.digest();  

最佳答案

Java 字节是有符号数字,但这仅意味着当将字节(即 8 位序列)视为数字时,Java 将其中一位视为符号位,而其他语言读取相同的序列位作为无符号数,不包含符号位。

MD5 算法是一种二进制算法,它将一个位(或字节)序列转换为另一个位(或字节)序列。 Java 的方式与任何其他语言的方式相同。仅当将字节显示为数字时,您才会得到不同的输出,具体取决于语言将字节转换为数字的方式。

所以简短的答案是,将使用 Java 生成的 MD5 哈希值发送到 C# 程序,它就会正常工作。

如果你想在Java中将字节数组显示为无符号数字,只需使用以下代码:

for (byte b : bytes) {
    System.out.println(b & 0xFF);
}

关于java - 如何在Java中获取未签名的md5哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512384/

相关文章:

java - 以编程方式设置扩展坞 :name Java Mac OS X JVM property

encryption - MD5二进制模式和文本模式之间有什么区别?

java - Long primitive 还是 AtomicLong 作为计数器?

java - 从 android 连接到 MySQL 数据库。没有迹象表明它正在工作/不工作......?

javascript - 如何在 JavaScript/Node.js 中生成 MD5 文件哈希?

android - 获取谷歌地图 API key

OpenCV 3.0 安装问题

c++ - C++ 中的 MD5 实现返回错误的摘要

java - 如何在整个应用程序中保持 session 直到用户在 android 中注销?

java - 在 Elasticsearch 中使用 NativeSearchQueryBuilder 时,如果与 multiMatchQuery 结合使用,rangequery 过滤器会失败