MD5在C#和Java之间产生不同的结果

时间:2015-06-07 10:06:03

标签: java c# md5

我有一个字节数组,我想分别在java和C#中计算MD5哈希值。但是,它们产生了截然不同的结果。

下面是我的C#代码:

byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };
MD5 md5 = MD5.Create();
byte[] result = md5.ComputeHash(input);

它生成md5哈希:85,126,37,15,86,254,54,94,243,185,219,84,21,17,192,153,

以下是java代码:

byte[] input = {90,12,-56,-117,85,104,9,-54,0,0,0,0,28,-5,54,-47,-23,-103,79,1};
byte[] md5 = MessageDigest.getInstance("MD5").digest(input);

它导致: -56,-74,-89,-76,9,35,-83,-89,-73,-39,17,83,24,18,-91,-62,

如您所见,结果完全不同。我知道c#使用无符号字节,java使用有符号字节。没有办法让我相信结果是一样的。

提前致谢。

1 个答案:

答案 0 :(得分:6)

您的C#和Java输入不一样。

让我们尝试将C#输入转换为有符号字节:

byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };

sbyte[] signedInput = input.Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", signedInput));

输出:

  

90,12,-56,-117,85,104,9,-54,0,0,0,0,28,-5,54, -55 , - 23, -103,79,1

这里有一个不同的字节,粗体。 Java版本在此偏移处包含 -47

为了确保,我们可以使用Java版本的输入进行简单的检查:

var javaInput = new[] { 90, 12, -56, -117, 85, 104, 9, -54, 0, 0, 0, 0, 28, -5, 54, -47, -23, -103, 79, 1 };
var javaInputUnsigned = javaInput.Select(i => unchecked((byte)i)).ToArray();
var hash = MD5.Create().ComputeHash(javaInputUnsigned).Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", hash));

这产生与Java版本相同的结果:

  

-56,-74,-89,-76,9,35,-83,-89,-73,-39,17,83,24,18,-91,-62