如何在 C# 和 Java 中生成相同的 MD5 哈希码?
我有一个在 C# 中生成 MD5 哈希的函数,如下所示:
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sb.Append(result[i].ToString("X2"));
}
return sb.ToString();
在 java 中,我的函数如下所示:
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(bytes,0,bytes.length);
String hashcode = new BigInteger(1,m.digest()).toString(16);
return hashcode;
当 C# 代码生成:“02945C9171FBFEF0296D22B0607D522D”时,java 代码生成:“5a700e63fa29a8eae77ebe0443d59239”。
有没有办法为相同的字节数组生成相同的 md5 哈希值?
按需:
这是 java 中的测试代码:
File file = new File(System.getProperty("user.dir") + "/HashCodeTest.flv");
byte[] bytes = null;
try {
bytes = FileUtils.getBytesFromFile(file);
} catch (IOException e) {
fail();
}
try {
generatedHashCode = HashCode.generate(bytes);
} catch (NoSuchAlgorithmException e) {
fail();
}
这是我的 C# 代码
var blob = GetBlobByHttpPostedFile(httpPostedFile);
var hashCode = Md5Factory.ConvertByteArray(blob);
private static byte[] GetBlobByHttpPostedFile(HttpPostedFile httpPostedFile)
{
var contentLength = httpPostedFile.ContentLength;
var result = new byte[contentLength];
var inputStream = httpPostedFile.InputStream;
inputStream.Read(result, 0, contentLength);
return result;
}
干杯
I have a function that generates a MD5 hash in C# like this:
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
sb.Append(result[i].ToString("X2"));
}
return sb.ToString();
In java my function looks like this:
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(bytes,0,bytes.length);
String hashcode = new BigInteger(1,m.digest()).toString(16);
return hashcode;
While the C# code generates: "02945C9171FBFEF0296D22B0607D522D" the java codes generates: "5a700e63fa29a8eae77ebe0443d59239".
Is there a way to generate the same md5 hash for the same bytearray?
On demand:
This is the testcode in java:
File file = new File(System.getProperty("user.dir") + "/HashCodeTest.flv");
byte[] bytes = null;
try {
bytes = FileUtils.getBytesFromFile(file);
} catch (IOException e) {
fail();
}
try {
generatedHashCode = HashCode.generate(bytes);
} catch (NoSuchAlgorithmException e) {
fail();
}
and this is my code in C#
var blob = GetBlobByHttpPostedFile(httpPostedFile);
var hashCode = Md5Factory.ConvertByteArray(blob);
private static byte[] GetBlobByHttpPostedFile(HttpPostedFile httpPostedFile)
{
var contentLength = httpPostedFile.ContentLength;
var result = new byte[contentLength];
var inputStream = httpPostedFile.InputStream;
inputStream.Read(result, 0, contentLength);
return result;
}
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
来简化 Java 代码
这应该没问题 - 尽管您可以通过调用而不是调用
update
然后调用digest
。您绝对确定在两种情况下都获得相同的数据吗?您能否发布示例程序,使用相同的硬编码数据显示此失败?
编辑:这是我正在考虑的测试。这两个程序给出相同的结果:
C#:
Java:
That should be fine - although you could make the Java code simpler by just calling
instead of calling
update
thendigest
.Are you absolutely sure you've got the same data in both cases? Could you post sample programs showing this failing with the same hard-coded data?
EDIT: Here's the sort of test I was thinking of. These two programs give the same result:
C#:
Java:
您好,我正在使用此代码,它适用于
C# 代码:
和 Java 代码:
Hi I m using this code and it works
C# code :
and Java code :
我遇到了类似的问题,我们使用 Java MD5 哈希来确定文件是否已被处理。我们发现无法使用 .NET 库创建相同的哈希值。我尝试了以上所有建议,不幸的是它对我不起作用。
后来我找到的解决方案是:我们不在.NET中创建类似的函数,而是直接在.NET中调用Java函数。有一个很棒的开源项目,称为 Ja.NET。基本上我所做的是:创建一个使用相同代码创建哈希的 Java 类。使用 Ja.NET javac 编译它。然后使用 bam 将生成的 Java 类文件编译为 DLL 并在我的 .NET 项目中使用它。
I came cross the similar issue that we were using Java MD5 Hash to determine whether a file has been processed. We found we cannot create same hash using .NET library. I tried all above suggestion, unfortunately it is not working for me.
The solution I found out later is: instead of create similar function in .NET, we call Java function directly in .NET. There is one great open source project called Ja.NET. Basically what i did is: create a Java class that create hash using the same code. compile it using Ja.NET javac. Then using bam compile the generated Java class file into DLL and use it in my .NET project.
我知道这个话题很旧,但我刚才遇到了同样的问题,找不到适合我的答案。我正在为游戏编写修补程序,需要文件的
md5
hashcode
作为确保文件最新的方法,但 C# 和 Java 给了我不同的字符串尽管文件是相同的。以下是我解决该问题的方法:
C# 代码:
这会创建一个 32 个字符的十六进制字符串。
Apache Commons
DigestUtils.md5Hex(InputStream)
的作用相同,现在唯一的不同是 C# 示例返回一个大写字符串,因此解决方案只是将 Java 程序中的哈希值转换为大写字符串。Java 代码:
生成的哈希值类似于
F674865D8A44695A2443017CFA2B0C67
。希望这对某人有帮助。
I know this topic is old but I ran into the same issue just now and couldn't find an answer that worked for me. I was writing a patcher for a game and needed the
md5
hashcode
of files as a way to ensure that the files are up to date, but C# and Java gave me different strings although the files were identical.Here's how I solved it:
C# Code:
This creates a 32 character hex string.
Apache Commons
DigestUtils.md5Hex(InputStream)
does the same, now the only different is that the C# example returns an uppercase string, so the solution is simply to convert the hash from the Java program to an uppercase string.Java code:
The produced hashes look like
F674865D8A44695A2443017CFA2B0C67
.Hope this helps someone.