我有 C# 代码,它从 String
生成 MD5 编码的 byte[]
,然后将此 byte[]
转换为 字符串
。 C# 代码是
byte[] valueBytes = (new UnicodeEncoding()).GetBytes(value);
byte[] newHash = (new MD5CryptoServiceProvider()).ComputeHash(valueBytes);
我需要在 Java 中得到相同的结果。我正在尝试这样做
Charset utf16 = Charset.forName("UTF-16");
return new String(DigestUtils.md5(value.getBytes(utf16)), utf16);
该代码使用 Apache Commons Codec 库进行 MD5 计算。我使用 UTF16 字符集是因为我在其他问题中读到 C# 的 UnicodeEncoding
默认使用它。
所以代码片段看起来像是做同样的事情,但是当我传递字符串 byndyusoft2014
时,C# 给我 hV7u6mQYRgBXXF9jOWWYJg==
而 Java 给我 ﹡둛뭶魙ꇥ늺ꢑ
。我尝试过 UTF16LE 和 UTF16BE 作为字符集,但没有成功。
有人知道我做错了什么吗?
最佳答案
我认为是因为 java 将字符串解码为 utf-8
到 byte[] ,但C#不是。所以java和C#对不同的字节数组进行编码,然后得到不同的结果。您可以在c#中使用utf-8将字符串解码为byte[],并查看结果。如下代码:
UTF8Encoding utf8 = new UTF8Encoding();
byte[] bytes=utf8.GetBytes("byndyusoft2014");
byte[] en=(new MD5CryptoServiceProvider()).ComputeHash(bytes);
Console.WriteLine(Convert.ToBase64String(en));
和java代码:
byte[] en = DigestUtils.md5Digest("byndyusoft2014".getBytes());
byte[] base64 = Base64Utils.encode(en);
System.out.println(new String(base64));
当然,在你的描述中,C#的结果喜欢用base64编码,所以java应该用base64对字节数组进行编码。
结果与 swPvmbGDI1GbPKQwL9knjQ==
相同
DigestUtils
和Base64Utils
是MD5
的一些实现和BAS64
在 Spring 库中
关于java - 如何在 Java 中获得与 C# 中相同的 MD5 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922110/