我在我的.net和Java应用程序中计算哈希。但是当他们给我结果时我遇到了问题,因为两者都给出了不同的结果。在搜索这个问题时,我发现了这些问题{{3} }和question 1根据他们的答案在那里应用但不幸的是我没有成功。我也尝试UTF-8
和UTF-16LE
但结果又不一样了。
现在我被困住了,想知道为什么会这样,我该如何解决?
我的代码片段如下: .Net
byte[] buffer2 = new SHA1CryptoServiceProvider().ComputeHash(bytes);
的爪哇
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] buffer2 = sha1.digest(bytes);
非常感谢任何帮助。
答案 0 :(得分:3)
我认为问题在于C#字节是无符号类型,而在java中则不是。
这两个代码同样有效:
public static void main(String[] args) throws NoSuchAlgorithmException {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] bytes = new byte[] { 1, 2, 10 };
byte[] buffer2 = sha1.digest(bytes);
for(byte b : buffer2){
System.out.println(b);
}
}
static void Main(string[] args)
{
var bytes = new byte[] { 1, 2, 10 };
var buffer = new SHA1CryptoServiceProvider().ComputeHash(bytes);
foreach (var b in buffer)
{
Console.WriteLine((sbyte)b); //attention to cast
}
Console.Read();
}
答案 1 :(得分:2)
所以只是回顾一下我的评论作为答案。
见:Calculating SHA-1 hashes in Java and C#
基本上 - Java字节是有符号的,而C#字节则不是。
两个结果的内部表示将是相同的,但除非您进行适当的转换,否则打印它们将产生不同的结果。